本文介紹了如何判斷您當前使用的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
參數值。對於主節點、普通列存節點或未開啟行存/列存自動引流的叢集地址,請切換至開啟行存/列存自動引流的叢集地址或者直接連接唯讀列存節點。