全部產品
Search
文件中心

PolarDB:擷取建立列存索引的DDL語句

更新時間:Jul 06, 2024

調用預存程序dbms_imci.columnar_advise(),可以針對某條SQL語句來擷取對應的DDL語句,執行擷取到的DDL語句可以為未被列索引覆蓋的列添加列索引,按順序執行完DDL語句後,即可保證這條SQL語句中使用的所有列都被列索引覆蓋。

前提條件

  • PolarDB叢集版本需滿足以下條件之一:

    • PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.30及以上。

    • PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.12及以上。

  • 您需要具有所操作的表的讀(SELECT)許可權。

文法

  • 擷取按表添加列存索引的DDL語句。

    dbms_imci.columnar_advise('<query_string>');
  • 擷取按列添加列存索引的DDL語句。

    dbms_imci.columnar_advise_by_columns('<query_string>');

參數說明

參數

說明

query_string

需要解析的SQL語句。

說明
  • 該SQL語句必須是符合規範的SELECT語句,不支援INSERTUPDATEDELETE等其他DML語句。如果SELECT語句不符合規範(例如引用了不存在的列),會返回相對應的錯誤資訊。

  • query_string必須是字串,不能使用變數值或查詢結果作為輸入。

注意事項

調用該預存程序僅擷取DDL語句,並不會執行DDL語句。

樣本

t1t2表為例,擷取建立列存索引的DDL語句。

  1. 執行如下命令,切換至test庫。

    use test;
  2. 執行如下命令,建立t1t2表。

    create table t1 (a int, b int) engine = innodb;
    create table t2 (a int, b int) engine = innodb;
  3. 調用預存程序,擷取DDL語句。

    • 擷取按表添加列存索引的DDL語句。

      call dbms_imci.columnar_advise('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');

      執行結果如下:

      +-------------------------------------------+
      | DDL_STATEMENT                             |
      +-------------------------------------------+
      | ALTER TABLE test.t1 COMMENT='COLUMNAR=1'; |
      | ALTER TABLE test.t2 COMMENT='COLUMNAR=1'; |
      +-------------------------------------------+
      2 rows in set (0.00 sec)

      SELECT語句中t1t2表中的列都沒有建立列索引。調用預存程序後,分別擷取了按表添加列索引的DDL語句,執行DDL語句後會為t1t2表中所有支援列存索引的列添加列索引。

    • 擷取按列添加列存索引的DDL語句。

      call dbms_imci.columnar_advise_by_columns('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');

      執行結果如下:

      mysql> call dbms_imci.columnar_advise_by_columns('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');
      +-------------------------------------------------------------------------------------------------------------------------------------------+
      | DDL_STATEMENT                                                                                                                             |
      +-------------------------------------------------------------------------------------------------------------------------------------------+
      | ALTER TABLE test.t1 MODIFY COLUMN a int(11) DEFAULT NULL COMMENT 'COLUMNAR=1', MODIFY COLUMN b int(11) DEFAULT NULL COMMENT 'COLUMNAR=1'; |
      | ALTER TABLE test.t2 MODIFY COLUMN a int(11) DEFAULT NULL COMMENT 'COLUMNAR=1';                                                            |
      +-------------------------------------------------------------------------------------------------------------------------------------------+
      2 rows in set (0.00 sec)

      SELECT語句僅查詢t1.at1.b以及t2.a三列,調用預存程序dbms_imci.columnar_advise_by_columns()可以得到按列添加列索引的DDL語句,執行DDL語句後,可以確保SELECT語句中的所有列都被列索引覆蓋。