dbms_imci.check_columnar_index() ストアドプロシージャは、入力したSQL文を解析し、SQL文で使用されているすべての列を取得して、これらの列に対してインメモリ列インデックス (IMCI) が有効かどうかを確認できます。
IMCIが無効な列がSQL文に含まれている場合、ストアドプロシージャはデータベース名、テーブル名、および列の名前を返します。
IMCIがSQL文のすべての列に対して有効な場合、ストアドプロシージャは空の結果セットを返します。
前提条件
PolarDBクラスターでは、次のいずれかのバージョンを使用します。
リビジョンバージョンが8.0.1.1.30以降のPolarDB for MySQL 8.0.1のクラスター。
リビジョンバージョンが8.0.2.2.12以降のPolarDB for MySQL 8.0.2のクラスター。
指定されたテーブルに対する読み取り (SELECT) 権限があること。
構文
dbms_imci.check_columnar_index('<query_string>');Parameters
パラメーター | 説明 |
query_string | 解析されるSQLステートメント。 説明
|
使用上の注意
ストアドプロシージャは大文字と小文字が区別されます。
ストアドプロシージャを使用してSQL文を解析し、SQL文のテーブル名の前にデータベース名を追加すると、そのデータベース名が使用されます。 SQL文のテーブル名の前にデータベース名が追加されていない場合は、
use db_nameステートメントを実行して、SQL文のテーブルを含むデータベースに切り替えてから、ストアドプロシージャを実行する必要があります。SQL文には長さ制限が設定されていませんが、クライアントからデータベースに送信されるSQL文の長さは、SQL文や
max_allowed_packetなどのパラメーターを解析するためのthread_stackパラメーターによって制限されます。IMCIがSQL文の列のデータ型をサポートしていない場合、ストアドプロシージャが呼び出されるとエラーメッセージが返されます。
SELECTステートメントは、準備されたステートメントのパラメータ化形式にすることができます。 しかし、準備... FROMキーワードは追加できません。
SQL文にエスケープが必要な文字 (
'や"など) が含まれている場合は、MySQL構文に基づいて文字をエスケープする必要があります。 サンプルコード:SQL文の
'を''に置き換えます。dbms_imci.check_columnar_indexを呼び出します (t1から 'select t1.a from t1.b='some_string''');SQL文の
"を" "に置き換えます。dbms_imci.check_columnar_index("select t1.a from t1 where t1.b = " "some_string" "");
エスケープルールの詳細については、「MySQLドキュメント」をご参照ください。
例
t1、t2、およびt3テーブルは、以下の例で使用される。 ストアドプロシージャを呼び出して、SQL文のすべての列でIMCIが有効かどうかを確認します。
次のステートメントを実行して、
testデータベースに切り替えます。使用テスト;次のステートメントを実行して、
t1、t2、およびt3テーブルを作成します。 IMCIは、t3テーブル内のすべての列に対して有効である。create table t1 (a int, b int) engine = innodb; 作成テーブルt2 (a int, b int) engine = innodb; 作成テーブルt3 (a int, b int) engine = innodb comment 'columnar=1';ストアドプロシージャを呼び出して、SQL文のすべての列でIMCIが有効かどうかを確認します。
SQL文は、
t1テーブルとt2テーブルの列を使用します。dbms_imci.check_columnar_index (t1.a) from t1 inner join t2 on t1.a = t2.a group by t1.b ') を呼び出します。サンプル結果:
+ ----------- -------------------------------------- | TABLE_SCHEMA | テーブル名 | COLUMN_NAME | + ------------ ------------------------------------- + | テスト | t1 | a | | テスト | t1 | b | | テスト | t2 | a | + ------------ ------------------------------------- + セットの3列 (0.01秒)SQL文は
t1.a、t1.b、およびt2.a列を使用し、IMCIは3つの列に対して無効です。 したがって、ストアドプロシージャは、データベース名、テーブル名、および3つの列の名前を返します。SQL文の列は
t3テーブルに属します。dbms_imci.check_columnar_indexを呼び出す (t3' から 'select a, b);サンプル結果:
空セット (0.00秒)IMCIは、
t3テーブル内のすべての列に対して有効である。 したがって、ストアドプロシージャは空の結果セットを返します。