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
テーブル内のすべての列に対して有効である。 したがって、ストアドプロシージャは空の結果セットを返します。