このトピックでは、クエリでインメモリ列インデックス (IMCI) 機能を使用できるかどうかを確認する方法について説明します。
方式
IMCIは、それがカバーする列のみをクエリするために使用できます。 クエリする列がIMCIで覆われている場合は、IMCI機能を使用してクエリを高速化できます。
説明照会する列に対してIMCIが有効かどうかを確認する方法の詳細については、「SQLステートメントのテーブルに対してIMCIが作成されているかどうかの確認」をご参照ください。
PolarDB for MySQLでは、カラムストアノードの実行プランが水平ツリー形式で表示されます。これは、チャートとして表示されるローストアノードの実行プランとは異なります。 このようにして、2種類の実行計画を簡単に区別できます。 例:
EXPLAINステートメントを実行して、クエリの実行計画を表示します。
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\G
行ストアノード実行プランが使用されている場合、次の結果が返されます。
+----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+ | 1 | SIMPLE | orders | NULL | ALL | PRIMARY | NULL | NULL | NULL | 1482516 | 33.33 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | customer | NULL | eq_ref | PRIMARY | PRIMARY | 8 | tpch1g.orders.O_CUSTKEY | 1 | 10.00 | Using where | | 1 | SIMPLE | lineitem | NULL | ref | PRIMARY | PRIMARY | 8 | tpch1g.orders.O_ORDERKEY | 3 | 33.33 | Using where | +----+-------------+----------+------------+--------+---------------+---------+---------+--------------------------+---------+----------+----------------------------------------------+ 3 rows in set, 1 warning (0.01 sec)
カラムストアノード実行プランを使用すると、次の結果が返されます。
*************************** 1. row *************************** IMCI Execution Plan (max_dop = 8, max_query_mem = 3435134976): Project | Exprs: temp_table3.lineitem.L_ORDERKEY, temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT), temp_table3.orders.O_ORDERDATE, temp_table3.orders.O_SHIPPRIORITY Sort | Exprs: temp_table3.SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT) DESC,temp_table3.orders.O_ORDERDATE ASC HashGroupby | OutputTable(3): temp_table3 | Grouping: lineitem.L_ORDERKEY orders.O_ORDERDATE orders.O_SHIPPRIORITY | Output Grouping: lineitem.L_ORDERKEY, orders.O_ORDERDATE, orders.O_SHIPPRIORITY | Aggrs: SUM(lineitem.L_EXTENDEDPRICE * 1.00 - lineitem.L_DISCOUNT) HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_ORDERKEY = lineitem.L_ORDERKEY HashJoin | HashMode: DYNAMIC | JoinMode: INNER | JoinPred: orders.O_CUSTKEY = customer.C_CUSTKEY CTableScan | InputTable(0): orders | Pred: (orders.O_ORDERDATE < 03/24/1995 00:00:00.000000) CTableScan | InputTable(1): customer | Pred: (customer.C_MKTSEGMENT = "BUILDING") CTableScan | InputTable(2): lineitem | Pred: (lineitem.L_SHIPDATE > 03/24/1995 00:00:00.000000) 1 row in set (0.04 sec)
よくある質問
クエリの実行プランが列ストアノードの実行プランではないのはなぜですか。
照会されたデータ列は、IMCIによってカバーされない場合がある。 この場合、データ列のIMCIを作成する必要があります。 IMCIの作成方法については、「create TABLEステートメントを実行してIMCIを作成する」または「DDLステートメントを実行してIMCIを動的に作成および削除する」をご参照ください。
クラスターエンドポイントで行ストアおよび列ストアノード間の自動リクエスト分散が有効になっている場合、
loose_imci_ap_threshold
パラメーターの値が要件を満たさない場合があります。SHOW STATUS LIKE 'Last_query_cost '
の値は、SHOW VARIABLES LIKE 'imci_ap_threshold'
の値より大きくなければなりません。 この要件を満たしていない場合は、PolarDBコンソールのPolarDBクラスターの [パラメーター] ページに移動し、loose_imci_ap_threshold
パラメーターの値を変更します。 詳細については、「ローストアおよびカラムストアノード間の自動リクエスト配布」トピックの「ステップ2: 自動リクエスト配布のしきい値の設定」をご参照ください。アプリケーションが読み取り専用列ストアノードに接続されている場合、
loose_cost_threshold_for_imci
パラメーターの値が要件を満たさない場合があります。SHOW STATUS LIKE 'Last query_cost '
の値は、SHOW VARIABLES LIKE 'cost_threshold_for_imci'
の値より大きくなければなりません。 この要件を満たしていない場合は、PolarDBコンソールのPolarDBクラスターの [パラメーター] ページに移動し、loose_cost_threshold_for_imci
パラメーターの値を変更します。 詳細については、「ローストアおよびカラムストアノード間の自動リクエスト配布」トピックの「ステップ2: 自動リクエスト配布のしきい値の設定」をご参照ください。アプリケーションは、プライマリノード、列ストアノード、または行ストアおよび列ストアノード間の自動リクエスト配布機能が無効になっているクラスターエンドポイントに接続されている可能性があります。 この場合、行ストアおよび列ストアノード間の自動リクエスト配布機能が有効になっているクラスターエンドポイントにアプリケーションを接続するか、読み取り専用列ストアノードにアプリケーションを接続します。