某些場景中,需要為某個業務或某個模塊創建列索引,而不僅僅是為一條或者幾條SELECT語句中的列創建列索引。在這種場景下,為了避免重復創建列索引,可以先調用存儲過程dbms_imci.columnar_advise_begin()
,然后再批量調用存儲過程dbms_imci.columnar_advise()
,批量調用完成后,再調用存儲過程dbms_imci.columnar_advise_show()
批量獲取DDL語句。
前提條件
PolarDB集群版本需滿足以下條件之一:
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.30及以上。
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.12及以上。
您需要具有所操作的表的讀(SELECT)權限。
語法
dbms_imci.columnar_advise_begin()
存儲過程
dbms_imci.columnar_advise_begin()
用于開啟批量獲取DDL語句模式。該存儲過程調用后,調用存儲過程dbms_imci.columnar_advise()
時,不會立即輸出DDL語句,而是緩存在內存中,緩存過程中不會記錄重復的表名和列名。最后通過調用存儲過程dbms_imci.columnar_advise_show()
或dbms_imci.columnar_advise_show_by_columns()
顯式獲取DDL語句。說明調用存儲過程
dbms_imci.columnar_advise_begin()
后,再調用存儲過程dbms_imci.columnar_advise_by_columns()
的效果與調用存儲過程dbms_imci.columnar_advise()
的效果相同。dbms_imci.columnar_advise_show()
按表展示存儲過程
dbms_imci.columnar_advise()
所獲取的DDL語句,且DDL語句不會重復覆蓋相同的表。dbms_imci.columnar_advise_show_by_columns()
按列展示存儲過程
dbms_imci.columnar_advise()
獲取的DDL語句,DDL語句不會重復覆蓋相同的列。dbms_imci.columnar_advise_end()
結束批量獲取DDL語句模式并清理緩存。調用存儲過程
dbms_imci.columnar_advise_end()
前可以重復調用dbms_imci.columnar_advise_show()
和dbms_imci.columnar_advise_show_by_columns()
,dbms_imci.columnar_advise_end()
調用后,再調用dbms_imci.columnar_advise_show()
會返回錯誤信息。
注意事項
用于緩存
dbms_imci.columnar_advise()
中間結果的最大內存受imci_columnar_advise_buffer_size
參數控制,默認為8 MB,一般情況下,能夠緩存幾千張表的DDL語句。如果需要緩存更多的DDL語句,可以使用SET命令適當調整imci_columnar_advise_buffer_size
參數值,如SET imci_columnar_advise_buffer_size = 16777216;
。即使沒有顯式調用存儲過程
dbms_imci.columnar_advise_end()
,當鏈接斷開時,也會清理dbms_imci.columnar_advise()
緩存。
示例
以t1
和t2
表為例,批量獲取創建列存索引的DDL語句。
執行如下命令,切換至
test
庫。use test;
執行如下命令,創建
t1
和t2
表。create table t1 (a int, b int) engine = innodb; create table t2 (a int, b int) engine = innodb;
調用存儲過程,開啟批量獲取DDL語句模式。
call dbms_imci.columnar_advise_begin();
批量執行存儲過程
dbms_imci.columnar_advise()
。call dbms_imci.columnar_advise('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b'); call dbms_imci.columnar_advise('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b'); call dbms_imci.columnar_advise('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b'); call dbms_imci.columnar_advise('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');
調用存儲過程,來顯示獲取DDL語句。
按表展示存儲過程
dbms_imci.columnar_advise()
所獲取的DDL語句。call dbms_imci.columnar_advise_show();
執行結果如下:
+-------------------------------------------+ | DDL_STATEMENT | +-------------------------------------------+ | ALTER TABLE test.t1 COMMENT='COLUMNAR=1'; | | ALTER TABLE test.t2 COMMENT='COLUMNAR=1'; | +-------------------------------------------+ 2 rows in set (0.00 sec)
按列展示存儲過程
dbms_imci.columnar_advise()
所獲取的DDL語句。call dbms_imci.columnar_advise_show_by_columns();
執行結果如下:
+-------------------------------------------------------------------------------------------------------------------------------------------+ | 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)
批量獲取DDL語句完成后,調用以下存儲過程,結束批量獲取DDL語句模式并清理緩存。
call dbms_imci.columnar_advise_end();
執行結果如下:
Query OK, 0 rows affected (0.11 sec)