問合せ7: 索引の一部であるフィールドによるデータのグループ化
すべての乗客の予約コードと手荷物の数をフェッチします。
SELECT bag.confNo, count(bag.bagInfo) AS TOTAL_BAGS
FROM BaggageInfo bag GROUP BY bag.confNo;
計画:
{
"iterator kind" : "SELECT",
"FROM" :
{
"iterator kind" : "RECEIVE",
"distribution kind" : "ALL_SHARDS",
"order by fields at positions" : [ 0 ],
"input iterator" :
{
"iterator kind" : "SELECT",
"FROM" :
{
"iterator kind" : "TABLE",
"target table" : "BaggageInfo",
"row variable" : "$$bag",
"index used" : "fixedschema_conf",
"covering index" : false,
"index scans" : [
{
"equality conditions" : {},
"range conditions" : {}
}
]
},
"FROM variable" : "$$bag",
"GROUP BY" : "Grouping by the first expression in the SELECT list",
"SELECT expressions" : [
{
"field name" : "confNo",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "confNo",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag"
}
}
},
{
"field name" : "TOTAL_BAGS",
"field expression" :
{
"iterator kind" : "FN_COUNT",
"input iterator" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "bagInfo",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$$bag"
}
}
}
}
]
}
},
"FROM variable" : "$from-1",
"GROUP BY" : "Grouping by the first expression in the SELECT list",
"SELECT expressions" : [
{
"field name" : "confNo",
"field expression" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "confNo",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$from-1"
}
}
},
{
"field name" : "TOTAL_BAGS",
"field expression" :
{
"iterator kind" : "FUNC_SUM",
"input iterator" :
{
"iterator kind" : "FIELD_STEP",
"field name" : "TOTAL_BAGS",
"input iterator" :
{
"iterator kind" : "VAR_REF",
"variable" : "$from-1"
}
}
}
}
]
}
説明:
- この問合せでは、乗客の
confNo
に基づいてすべての手荷物をグループ化し、各confNo
に属する手荷物の合計数を決定します。 - group-byは索引ベースです。つまり、group-byフィールド(
confNo
)は使用される索引の一部でもあります。このことはGROUPイテレータがないことによって示されています。かわりに、SELECTイテレータによってグループ化が行われます。 - 2つのSELECTイテレータがあり、内側のイテレータには、どのSELECT句式がグループ化式でもあるかを指定する
GROUP BY
プロパティがあります。ここでは、group byフィールドは、SELECTリストの最初の式(bag.confNo
)です。"GROUP BY" : "Grouping by the first expression in the SELECT list"
- ここでは索引
fixedschema_conf
が使用され、この例ではこれはカバー索引ではありません(索引のエントリの外部にあるcount(bag.bagInfo)
も問合せでフェッチする必要があるため)。 - FROMイテレータがTABLEイテレータの場合、FROM変数は、使用されている索引がカバー索引かどうかに応じて、TABLEイテレータのindex row variableまたはrow variableのいずれかと同じになります。この例ではカバー索引ではないため、内側のFROM変数はrow variable (
$$bag
)と同じになります。 - SELECT式では、2つのフィールド(
bag.confNo,count(bag.bagInfo)
)がフェッチされます。これらは、SELECT式句の2つのフィールド名およびフィールド式に対応します。 - 内側のSELECTイテレータによって様々なRNから返される結果は部分グループです。これは、同じ
bag.confNo
の行が複数のRNに存在する場合があるためです。そのため、再グループ化および再集計はドライバで実行する必要があります。これは、外側のSELECTイテレータ(RECEIVEイテレータの上にある)によって行われます。 - 結果は、
confNo
でソートも行われます。order by fields at positions
プロパティは、ソートに使用するフィールドを指定します。この配列の値は、SELECT式でソートされるフィールドの位置によって異なります。この例では、bag.confNo
はSELECT式の最初のフィールドです。そのため、order by fields at positions
では配列索引0
を使用します。"order by fields at positions" : [ 0 ]
- 外側のSELECT式では、2つのフィールド(
bag.confNo,count(bag.bagInfo)
)がフェッチされます。$from-1
FROM変数は、外側のSELECT式の他の句を実装するイテレータによって参照されます。これらは、外側のSELECT式句の2つのフィールド名およびフィールド式に対応します。最初のフィールドについては、フィールド式でFIELD_STEP
イテレータが使用されます。2番目のフィールドは、集計ファンクションcount
です。イテレータFUNC_SUM
は、親イテレータによって生成された結果を反復処理して手荷物の合計数を決定するために使用されます。