預存程序dbms_imci.check_columnar_index()
可以解析輸入的SQL語句,並得到SQL語句中使用的所有列,並檢查這些列是否被列索引覆蓋。
如果SQL語句中使用了未被列索引覆蓋的列,調用該預存程序後會返回這些列所在的庫名、表名以及列名。
如果SQL語句中使用的所有列都已經被列索引覆蓋,調用該預存程序會返回空的結果集。
前提條件
PolarDB叢集版本需滿足以下條件之一:
PolarDB MySQL版8.0.1版本且修訂版本為8.0.1.1.30及以上。
PolarDB MySQL版8.0.2版本且修訂版本為8.0.2.2.12及以上。
您需要具有所操作的表的讀(SELECT)許可權。
文法
dbms_imci.check_columnar_index('<query_string>');
參數說明
參數 | 說明 |
query_string | 需要解析的SQL語句。 說明
|
注意事項
預存程序名稱區分大小寫。
使用該預存程序解析SQL語句時,如果SQL語句中的表名前添加了庫名,則使用SQL語句中的庫名。如果SQL語句中的表名前沒有添加庫名,則必須使用
use db_name
命令切換至SQL語句中的表所在的庫後,再執行該預存程序。SQL語句沒有特殊的長度限制,但用戶端向資料庫發送的SQL語句長度受限於
max_allowed_packet
等參數,以及解析SQL語句時使用的thread_stack
參數。如果列存索引不支援SQL語句中使用的列的類型,調用該預存程序時會返回錯誤資訊。
SELECT語句可以為Prepared Statement的參數化形式,但不能添加PREPARE ... FROM關鍵詞。
如果SQL語句中使用了
'
或"
等需要轉義的字元,則需要按照MySQL的文法規則進行轉義。樣本如下:將SQL語句中的
'
換成''
。call dbms_imci.check_columnar_index('select t1.a from t1 where t1.b = ''some_string''');
將SQL語句中的
"
換成""
。call dbms_imci.check_columnar_index("select t1.a from t1 where t1.b = ""some_string""");
更多轉義規則請參見MySQL官網。
樣本
以t1
、t2
和t3
表為例,調用預存程序檢查SQL語句中是否存在未被列存索引覆蓋的列。
執行如下命令,切換至
test
庫。use test;
執行如下命令,建立
t1
、t2
和t3
表,其中t3
表的所有列都被列索引覆蓋。create table t1 (a int, b int) engine = innodb; create table t2 (a int, b int) engine = innodb; create table t3 (a int, b int) engine = innodb comment 'columnar=1';
調用預存程序,檢查SQL語句中是否有未被列索引覆蓋的列。
SQL語句中的列為
t1
和t2
表中的列。call dbms_imci.check_columnar_index('select count(t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b');
執行結果如下:
+--------------+------------+-------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | +--------------+------------+-------------+ | test | t1 | a | | test | t1 | b | | test | t2 | a | +--------------+------------+-------------+ 3 rows in set (0.01 sec)
SQL語句中使用了
t1.a
、t1.b
以及t2.a
三列,且這三列沒有被列索引覆蓋。因此,調用該預存程序時,返回這三列對應的庫名、表名以及列名。SQL語句中的列為表
t3
中的列。call dbms_imci.check_columnar_index('select a, b from t3');
執行結果如下:
Empty set (0.00 sec)
表
t3
中的所有列都被列索引覆蓋。因此,調用該預存程序時,返回空結果集。