ここでは、次のテーブルの定義を使用します。
CREATE TABLE customer ( c_custkey INTEGER NOT NULL, c_name CHARACTER(26) CASESPECIFIC NOT NULL, c_address VARCHAR(41), c_nationkey INTEGER, c_phone CHARACTER(16), c_acctbal DECIMAL(13,2), c_mktsegment CHARACTER(21), c_comment VARCHAR(127)) UNIQUE PRIMARY INDEX (c_custkey); CREATE TABLE orders ( o_orderkey INTEGER NOT NULL, o_custkey INTEGER, o_orderstatus CHARACTER(1) CASESPECIFIC, o_totalprice DECIMAL(13,2) NOT NULL, o_orderdate DATE FORMAT 'YYYY-MM-DD' NOT NULL, o_orderpriority CHARACTER(21), o_clerk CHARACTER(16), o_shippriority INTEGER, o_comment VARCHAR(79)) UNIQUE PRIMARY INDEX (o_orderkey);
次の集約結合問合わせについて考えましょう。
SELECT COUNT(*), SUM(o_totalprice) FROM orders, customer WHERE o_custkey = c_custkey AND o_orderdate > DATE '1998-09-20' AND o_orderdate < DATE '1998-10-15' GROUP BY c_nationkey;
集約結合インデックスがない場合、この問合わせの一般的な実行計画には、次のステップが含まれます。
- オーダーをスプール ファイルに再分配する。
- スプール ファイルをo_custkeyに従ってソートする。
- ソートされたスプール ファイルとカスタマー ファイルをマージ結合する。
- マージ結合の結果を集約する。
以下の集約結合インデックスを定義するとします。この集約結合インデックスは、オーダーと カスタマーの結合にo_totalpriceを集約します。
SELECT c_nationkey, SUM(o_totalprice(FLOAT)) AS price, o_orderdate FROM orders, customer WHERE o_custkey = c_custkey GROUP BY c_nationkey, o_orderdate ORDER BY o_orderdate;
最適化ルーチンによって作成される、このクエリーのための実行計画には、集約結合インデックス(どの結合テーブルよりもずっと小さい)での集約手順が含まれます。SELECT文のEXPLAINには、c_nationkeyによってグループ化された、条件("(ord_cust_idx.O_ORDERDATE > DATE '1998-09-20') AND (ord_cust_idx.O_ORDERDATE < DATE '1998-10-15')")の結合インデックス テーブルord_cust_idxから集約するSUMステップが含まれています。
EXPLAIN SELECT COUNT(*), SUM(o_totalprice) FROM orders, customer WHERE o_custkey = c_custkey AND o_orderdate > DATE '1998-09-20' AND o_orderdate < DATE '1998-10-15' GROUP BY c_nationkey;