問合せ6: 索引条件での2次索引の使用
到着日が指定した値より後である乗客の名前、チケット番号および到着日をフェッチします。
SELECT fullName, bag.ticketNo, bag.bagInfo[].bagArrivalDate
FROM BaggageInfo bag WHERE EXISTS
bag.bagInfo[$element.bagArrivalDate >="2019-01-01T00:00:00"]
計画:
{
"iterator kind" : "RECEIVE",
"distribution kind" : "ALL_SHARDS",
"distinct by fields at positions" : [ 1 ],
"input iterator" :
{
"iterator kind" : "SELECT",
"FROM" :
{
"iterator kind" : "TABLE",
"target table" : "BaggageInfo",
"row variable" : "$$bag",
"index used" : "simpleindex_arrival",
"covering index" : false,
"index row variable" : "$$bag_idx",
"index scans" : [
{
"equality conditions" : {},
"range conditions" : {}
}
],
"index filtering predicate" :
{
"iterator kind" : "GREATER_OR_EQUAL",
"left operand" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "bagInfo[].bagArrivalDate",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag_idx"
}
},
"right operand" :
{
"iterator kind" : "CONST",
"value" : "2019-01-01T00:00:00"
}
}
},
"FROM variable" : "$$bag",
"SELECT expressions" : [
{
"field name" : "fullName",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "fullName",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag"
}
}
},
{
"field name" : "ticketNo",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "ticketNo",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag"
}
}
},
{
"field name" : "bagArrivalDate",
"field expression" :
{
"iterator kind" : "ARRAY_CONSTRUCTOR",
"conditional" : true,
"input iterators" : [
{
"iterator kind" : "FIELD_STEP",
"field name" : "bagArrivalDate",
"input iterator" :
{
"iterator kind" : "ARRAY_FILTER",
"input iterator" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "bagInfo",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag"
}
}
}
}
]
}
}
]
}
}
説明:
- この問合せ計画のルート・イテレータはRECEIVEイテレータで、子が1つ(入力イテレータ)あり、それはSELECTイテレータです。
FROM
フィールドの値がイテレータです。このケースではTABLEイテレータとなります。- EXISTS条件は、実際にはフィルタリング条件に変換されます。1つのフィルタリング条件(つまりWHERE式全体)が存在します。ここでは、索引
simpleindex_arrival
のみが適用可能な索引であり、使用されています。 index filtering predicate
は、bagArrivalDate
フィールドのフィルタ基準を評価します。「より大きい」演算子と「より小さい」演算子を使用して、フィルタ条件が評価されます。- FROM変数は、FROMイテレータによって生成されるレコード全体にわたる変数の名前です。ここではFROMイテレータはTABLEイテレータで、FROM変数(
$$bag
)は、使用する索引がカバー索引ではないため、TABLEイテレータのrow variableと同じになります。 - SELECT式では、3つのフィールド(
fullname, ticketNo,bag.bagInfo[].bagArrivalDat
)がフェッチされます。これらは、SELECT式句の3つのフィールド名およびフィールド式に対応します。最初の2つのフィールドについては、フィールド式がFIELD_STEP
イテレータを使用して計算されます。最後のフィールドについては、対応する配列を反復処理するARRAY_CONSTRUCTOR
イテレータを使用してフィールド値がフェッチされます。