全部產品
Search
文件中心

PolarDB:檢查SQL語句中的表是否已建立列索引

更新時間:Jul 06, 2024

預存程序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語句必須是符合規範的SELECT語句,不支援INSERTUPDATEDELETE等其他DML語句。如果SELECT語句不符合規範(例如引用了不存在的列),會返回相對應的錯誤資訊。

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

注意事項

  • 預存程序名稱區分大小寫。

  • 使用該預存程序解析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官網

樣本

t1t2t3表為例,調用預存程序檢查SQL語句中是否存在未被列存索引覆蓋的列。

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

    use test;
  2. 執行如下命令,建立t1t2t3表,其中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';
  3. 調用預存程序,檢查SQL語句中是否有未被列索引覆蓋的列。

    • SQL語句中的列為t1t2表中的列。

      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.at1.b以及t2.a三列,且這三列沒有被列索引覆蓋。因此,調用該預存程序時,返回這三列對應的庫名、表名以及列名。

    • SQL語句中的列為表t3中的列。

      call dbms_imci.check_columnar_index('select a, b from t3');

      執行結果如下:

      Empty set (0.00 sec)

      t3中的所有列都被列索引覆蓋。因此,調用該預存程序時,返回空結果集。