全部產品
Search
文件中心

PolarDB:使用Explain分析SQL執行計畫

更新時間:Jul 06, 2024

本文介紹了如何判斷您當前使用的SQL語句能否使用列存索引加速功能。

判斷方法

  • 列存索引只能訪問被列存索引覆蓋到的資料列的資料,因此,當您需要查詢的列都被列存索引覆蓋時,便可以使用列存索引加速功能。

    說明

    如何判斷您需要查詢的列是否被列存索引覆蓋,請參考檢查SQL語句中的表是否已建立列索引

  • PolarDB MySQL版中,列存執行計畫以橫向樹的格式輸出,與行存執行計畫的輸出格式有一定的區分度,您可以通過查看執行計畫的方式來判斷某條SQL語句是否可以使用列存索引加速功能。樣本如下:

    執行如下命令,查看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\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)

FAQ

當某條SQL語句的執行計畫不是列存執行計畫時,可能的原因有哪些?

  • SQL語句查詢的資料列是否被列存索引覆蓋,若資料列沒有被列存索引覆蓋,請為需要使用列存執行計畫的資料列建立列存索引,建立列存索引請參見建表時建立列存索引的DDL文法動態增加或刪除列存索引的DDL文法

  • 對於已開啟行存/列存自動引流的叢集地址,請確認參數設定中的loose_imci_ap_threshold參數值是否滿足條件,即檢查SHOW STATUS LIKE 'Last_query_cost'的值是否大於SHOW VARIABLES LIKE 'imci_ap_threshold'的值。若不滿足,請參考配置自動引流閾值中的內容適當修改loose_imci_ap_threshold參數值。

  • 對於唯讀列存節點, 請確認參數設定中的loose_cost_threshold_for_imci參數值是否滿足條件,即檢查SHOW STATUS LIKE 'Last_query_cost'的值是否大於SHOW VARIABLES LIKE 'cost_threshold_for_imci'的值。若不滿足,請參考配置自動引流閾值中的內容適當修改loose_cost_threshold_for_imci參數值。

  • 對於主節點、普通列存節點或未開啟行存/列存自動引流的叢集地址,請切換至開啟行存/列存自動引流的叢集地址或者直接連接唯讀列存節點。