問合せ5: カバー索引を使用したデータのソート
すべての乗客の名前と電話番号をフェッチします。
SELECT bag.contactPhone, bag.fullName FROM BaggageInfo bag
ORDER BY bag.fullName
計画:
{
"iterator kind" : "RECEIVE",
"distribution kind" : "ALL_SHARDS",
"order by fields at positions" : [ 1 ],
"input iterator" :
{
"iterator kind" : "SELECT",
"FROM" :
{
"iterator kind" : "TABLE",
"target table" : "BaggageInfo",
"row variable" : "$$bag",
"index used" : "compindex_namephone",
"covering index" : true,
"index row variable" : "$$bag_idx",
"index scans" : [
{
"equality conditions" : {},
"range conditions" : {}
}
]
},
"FROM variable" : "$$bag_idx",
"SELECT expressions" : [
{
"field name" : "contactPhone",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "contactPhone",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag_idx"
}
}
},
{
"field name" : "fullName",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "fullName",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag_idx"
}
}
}
]
}
}
説明:
- この問合せ計画のルート・イテレータはRECEIVEイテレータで、子が1つ(入力イテレータ)あり、それはSELECTイテレータです。この例のRECEIVEイテレータのプロパティは、値がALL_SHARDSであるdistribution kindのみです。
- 結果を
fullName
でソートする必要があります。fullName
は、compindex_namephone
索引の一部です。そのため、この例では、個別のSORT演算子は必要ありません。ソートは、RECEIVE演算子で、配列であるプロパティorder by fields at positions
を使用して実行されます。この配列の値は、SELECT式でソートされるフィールドの位置によって異なります。"order by fields at positions" : [ 1 ]
- この例では、SELECT式の2番目のフィールドである
fullName
を使用して、order byが実行されます。そのため、イテレータのorder by fields at position
プロパティには1
が表示されています。 - ここでは、索引
compindex_namephone
が使用されます。この例では索引のエントリのみを使用して問合せを評価できるため、この索引はカバー索引です。 - index row variableは
$$bag_idx
で、これはTABLEイテレータによって生成された索引エントリ全体にわたる変数の名前です。新しい索引エントリが索引スキャンによって生成されるたびに、$$bag_idx
変数がそのエントリにバインドされます。 - FROMイテレータがTABLEイテレータの場合、FROM変数は、使用されている索引がカバー索引かどうかに応じて、TABLEイテレータのindex row variableまたはrow variableのいずれかと同じになります。この例では、索引がカバー索引であるため、FROM変数はindex row variable (
$$bag_idx
)と同じです。 - このindex row variable (
$$bag_idx
)は、SELECT式の他の句を実装するイテレータによって参照されます。 - SELECT式では、2つのフィールド(
contactPhone,fullName
)がフェッチされます。これらは、SELECT式句の2つのフィールド名およびフィールド式に対応します。両方のフィールドについて、フィールド式がFIELD_STEP
イテレータを使用して計算されます。