すべてのプロダクト
Search
ドキュメントセンター

PolarDB:EXPLAINを使用したSQL文の実行計画の分析

最終更新日:Jul 01, 2024

このトピックでは、クエリでインメモリ列インデックス (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: 自動リクエスト配布のしきい値の設定」をご参照ください。

  • アプリケーションは、プライマリノード、列ストアノード、または行ストアおよび列ストアノード間の自動リクエスト配布機能が無効になっているクラスターエンドポイントに接続されている可能性があります。 この場合、行ストアおよび列ストアノード間の自動リクエスト配布機能が有効になっているクラスターエンドポイントにアプリケーションを接続するか、読み取り専用列ストアノードにアプリケーションを接続します。