NoSQL Databaseでの索引の使用

Oracle NoSQL Databaseでは、問合せプロセッサは、使用可能な索引のうち問合せに有効なものを識別し、その索引を利用するように問合せをリライトできます。

索引を使用するとは、そのエントリの連続した部分範囲をスキャンしたり、その部分範囲内のエントリに対してさらにフィルタリング条件を適用したり、関連する表の行を抽出して返すために、索引エントリに格納されている主キーを使用することを意味します。スキャンする索引エントリの部分範囲はWHERE句の条件によって決定され、その一部は索引の検索条件に変換される場合があります。索引エントリの(できれば小さい)サブセットのみが検索条件を満たす場合、個々の表の行にアクセスせずに問合せを評価できるため、大量に発生する可能性があるディスク・アクセスを抑制できます。

Oracle NoSQL Databaseでは、主キー索引がデフォルトで常に作成されます。この索引は、表の主キー列を表の行の物理的な位置にマップします。また、使用可能な他の索引がない場合は、主索引が使用されます。つまり、純粋な表スキャン・メカニズムはありません。表スキャンは主キー索引を使用したスキャンと同等です。索引および問合せについては、問合せプロセッサが次の2つの質問に回答する必要があります。
  1. 索引は問合せに適用可能ですか。つまり、この索引を使用して表にアクセスするほうが、(主索引を使用して)全表スキャンを実行するよりも効率的ですか。
  2. 適用可能な索引の中で、どの索引または索引の組合せを使用するのが最適ですか。

表の列内の値の数と分布に関する統計はありません。そのため、問合せプロセッサは、適用可能な索引の選択において、単純な経験則に依存するしかありません。また、SQL for Oracle NoSQL Databaseでは、問合せに索引ヒントを含めることができます。索引ヒントを使用すると、問合せで特定の索引の使用を強制できます。問合せ実行計画を使用して、問合せで使用されている索引を把握できます。問合せの実行方法の詳細は、「問合せ実行計画」を参照してください。

2次索引

読取り要件の一部をサポートするために、2次索引を使用することが必要になる場合があります。各2次索引を表に追加すると、各索引を維持する必要があるため、書込みのオーバーヘッドが発生します。Oracle NoSQLの優れた点は、2次索引パーティションが主データと同じシャードに存在するため、2次索引に対する更新がシャード単位で制限されることです。Oracle NoSQLの索引更新もアトミックであるため、シャード内のレコードに対する更新が2次索引に対する更新と一致し、これらの構造は必ず同期することがアプリケーションに対して保証されます。考慮するもう1つの要素は、Oracle NoSQL Databaseノードでは、リーフ以外の索引ノードがキャッシュに保持され、リーフ部分(データ・レコードなど)がキャッシュされないことです。これにより、索引付きスキャンでは、索引なしスキャンを上回るパフォーマンス上の多数の利点が得られます(回転式ディスクを使用するシステムの場合)。

Oracle NoSQL Databaseで2次索引の使用を決定する際には、いくつかの点を考慮する必要があります。
  • ソースに近いデータのフィルタ処理 - Oracle NoSQL Databaseでは、問合せにフィルタが必要で、そのフィルタをデータのできるかぎり近くで実行する必要がある場合、主なメカニズムとして2次索引を利用します。問合せ用にデータをフィルタ処理する際に2次索引が必要な理由を完全に理解するために、表内のデータをスキャンするオプションについて考えてみましょう。
    • フル・シャード・キーのない、順序付けされていないパラレル表スキャン - シャード・キーは、表で行をどのように分散するかを制御するために使用される、その表の1つ以上の列です。シャード・キーの主な目的は、スケーラビリティ実現のためにOracle NoSQL Database Cloudクラスタ全体にデータを分散し、かつ参照およびアクセスしやすくするために、同じシャード・キーを共有するレコードをローカルに配置することです。フィルタを使用する問合せを記述し、そこに含まれる列の中にシャード・キーの一部であるものとそれ以外のものがある場合は、結局パラレル表スキャンを実行することになります。各シャードはパラレルにスキャンされ、データがアプリケーションに返されます。これにより、NoSQL Databaseのすべてのシャードにわたる表内のすべてのレコードが返されます。
    • 順序付きまたは順序付けされていないパラレル索引スキャン - 各シャードのBツリー索引がパラレルにスキャンされます。順序付きスキャンが要求されると、結果がマージされて表示されます。
  • 表をスキャンする各オプションには独自のコストと利点があり、これらのトレードオフを慎重に検討し、アプリケーション要件と予想されるワークロードについて知っている情報を使用して、モデル化の決定に役立てる必要があります。
    • 効率的なレンジ・スキャン - 問合せで値の範囲を制限することはよくありますか。たとえば、アプリケーションで、日付範囲内のすべてのレコードを検索するなどの問合せに回答する必要がある場合、Oracle NoSQL Databaseの2次索引を使用すると、アプリケーションでこれらのタイプの問合せに最も簡単かつ効率的に回答できます。
    • ワークロードおよび索引メンテナンスの更新 - 索引メンテナンスのために、書込みで追加のオーバーヘッドが発生することは許容されますか。追加の書込みオーバーヘッドが発生することよりも読取りのレイテンシが重要である場合に、ワークロードで大量の読取りアクティビティが発生しますか。

問合せでの索引の使用に関するガイドラインの詳細は、「SQL問合せのチューニングおよび最適化」を参照してください。