単純索引

索引は、配列またはマップを索引付けしない場合は単純索引です。より正確には、次の場合には索引は単純索引になります。
  • 各索引パスが単純なname_path (.key ()ステップ、.values ()ステップ、または[]ステップがない)です。前述の名前とパスの制限の下では、このname_pathは表の行ごとに1つの項目のみを返します。
  • そのような索引パスごとに返される項目が索引付け可能なアトミック型を持ちます。

前述の条件を満たすパスを単純な索引パスと呼びます。

前述の定義を使用した場合、単純索引のコンテンツは、次のように計算されます。行Rごとに索引パスが計算され、索引パスとRの主キー列によって返される項目をフィールド値として持つ単一の索引エントリが作成されます。WITH NO NULLS句を指定して索引を作成し、索引エントリにNULLまたはEMPTY値が含まれている場合、エントリは破棄され、それ以外の場合、エントリは索引に挿入されます。その結果、WITH NO NULLS句を使用しなかった場合、索引には表の行ごとに1つのエントリが含まれます。

WITH NO NULLS句を使用して作成された索引は、索引付けされたフィールドにNULL値や存在しない値が大量に含まれている場合に便利です。これは、索引付けの時間と領域のオーバーヘッドが減少するためです。ただし、問合せの最適化のための索引の使用方法の項で説明されているように、問合せによるこのような索引の使用は制限されています。

例8-1 単純索引

CREATE INDEX idx1 ON Users2 (income);

Users表にユーザーごとに1つのエントリを持つ索引が作成されます。エントリには、行によって表されるユーザーの所得とIDが含まれています。Users2のサンプル行のこの索引の内容は、次のとおりです。

[ 1000, 0 ]
[ 2000, 2 ]
[ NULL, 1 ]

前述のcreate index文でWITH NO NULLS句が使用された場合、前述の3つのエントリの最後のエントリは索引に表示されません。

例8-2 単純索引

CREATE INDEX idx2 ON Users2 (address.state, address.city, income);

Users表にユーザーごとに1つのエントリを持つ索引が作成されます。エントリには、行によって表されるユーザーの州、市、所得およびIDが含まれます。Users2のサンプル行のこの索引の内容は、次のとおりです。

[ "CA", "San Fransisco", NULL, 1 ]
[ "CA", "San Jose", 2000, 2 ]
[ "MA", "Boston", 1000, 0 ]

例8-3 単純索引

CREATE INDEX idx3 ON Users2 (expenses.books);

ユーザーごとに索引エントリを作成します。このエントリには、ユーザーが書籍への支出を記録する場合は、ユーザーの書籍への支出が含まれ、expensesにbooksエントリがない場合はEMPTY、expensesマップが一切存在しない場合(expenses列の値がNULLである場合)はNULLが含まれます。Users2のサンプル行のこの索引の内容は、次のとおりです。

[ 20, 0 ]
[ EMPTY, 1 ]
[ NULL, 2 ]

前述のcreate index文でWITH NO NULLS句が使用された場合は、前述の3つのエントリの最初のエントリのみが索引に表示されます。

例8-4 単純索引

CREATE INDEX idx4 ON users2 (expenses.housing, expenses.travel);

ユーザーごとに索引エントリを作成します。エントリには、ユーザーの住居費用、またはユーザーが住宅費用を記録しない場合はEMPTY、およびユーザーの出張費用、またはユーザーが出張経費を記録しない場合はEMPTYが含まれます。expensesがNULLの場合、索引エントリの両方のフィールドがNULLになります。Users2のサンプル行のこの索引の内容は、次のとおりです。

[ 1000, 300, 1 ]
[ 1000, EMPTY, 0 ]
[ NULL, NULL, 2 ]