获取创建列存索引的DDL语句

调用存储过程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语句中的所有列都被列索引覆盖。