このトピックでは、EXPLAIN ステートメントを使用して、インメモリ列インデックス (IMCI) を使用して SQL クエリを高速化するかどうかを判断する方法について説明します。
例
PolarDB for MySQL クラスタでは、列形式のデータに対するクエリの execution plan は、行ベース形式のデータに対するクエリの execution plan の出力形式とは異なる、水平ツリー形式で表示されます。 EXPLAIN ステートメントを実行して、SQL クエリの PolarDB for MySQL を表示し、IMCI を使用してクエリを高速化するかどうかを判断できます。
SQL クエリの例:
EXPLAIN SELECT l_orderkey, SUM(l_extendedprice * (1 - l_discount)) AS revenue, o_orderdate, o_shippriority
FROM customer, orders, lineitem
WHERE c_mktsegment = 'BUILDING'
AND c_custkey = o_custkey
AND l_orderkey = o_orderkey
AND o_orderdate < date '1995-03-24'
AND l_shipdate > date '1995-03-24'
GROUP BY l_orderkey, o_orderdate, o_shippriority
ORDER BY revenue DESC, o_orderdate;クエリ対象のデータが行ベース形式の場合の実行計画:
+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
| 1 | SIMPLE | customer | NULL | ALL | PRIMARY | NULL | NULL | NULL | 147630 | 10.00 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | orders | NULL | ref | PRIMARY,ORDERS_FK1 | ORDERS_FK1 | 4 | tpch100g.customer.C_CUSTKEY | 14 | 33.33 | Using where |
| 1 | SIMPLE | lineitem | NULL | ref | PRIMARY | PRIMARY | 4 | tpch100g.orders.O_ORDERKEY | 4 | 33.33 | Using where |
+----+-------------+----------+------------+------+--------------------+------------+---------+-----------------------------+--------+----------+----------------------------------------------+
3 rows in set, 1 warning (0.00 sec)クエリ対象のデータが列形式の場合の実行計画 (水平ツリー形式):
+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
| ID | Operator | Name | E-Rows | E-Cost | Extra Info |
+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
| 1 | Select Statement | | | | IMCI Execution Plan (max_dop = 4, max_query_mem = 858993459) |
| 2 | └─Sort | | | | Sort Key: revenue DESC,o_orderdate ASC |
| 3 | └─Hash Groupby | | | | Group Key: (lineitem.L_ORDERKEY, orders.O_ORDERDATE, orders.O_SHIPPRIORITY) |
| 4 | └─Hash Join | | | | Join Cond: orders.O_ORDERKEY = lineitem.L_ORDERKEY |
| 5 | ├─Hash Join | | | | Join Cond: customer.C_CUSTKEY = orders.O_CUSTKEY |
| 6 | │ ├─Table Scan | customer | | | Cond: (C_MKTSEGMENT = "BUILDING") |
| 7 | │ └─Table Scan | orders | | | Cond: (O_ORDERDATE < 03/24/1995) |
| 8 | └─Table Scan | lineitem | | | Cond: (L_SHIPDATE > 03/24/1995) |
+----+----------------------------+----------+--------+--------+-----------------------------------------------------------------------------+
8 rows in set (0.01 sec)関連情報
IMCI は、IMCI がカバーする列にのみアクセスできます。 SQL statement で参照されているテーブルまたは列が IMCI で完全にカバーされていない場合、IMCI は有効になりません。
SQL statement で参照されているテーブルに IMCI が作成されているかどうかを確認するには、
dbms_imci.check_columnar_index()ストアドプロシージャを呼び出します。このストアドプロシージャは、入力した SQL statement を解析し、statement で参照されているすべての列を取得し、それらの列が IMCI でカバーされているかどうかを確認できます。詳細については、「SQL ステートメントのテーブルに IMCI が作成されているかどうかの確認」をご参照ください。IMCI の作成に使用された DDL statement を取得するには、
dbms_imci.columnar_advise()ストアドプロシージャを呼び出します。このストアドプロシージャは、入力した SQL statement に基づいて、IMCI の作成に使用された DDL statement を返すことができます。詳細については、「IMCI の作成に使用された DDL ステートメントの取得」をご参照ください。 DDL statement を実行すると、SQL statement で参照されているすべての列をカバーする IMCI が作成されます。