dbms_imci.columnar_advise() または dbms_imci.columnar_advise_by_columns() を呼び出して、指定されたクエリに対してインメモリー列指向インデックス (IMCI) を作成するのに必要な DDL ステートメントを生成します。いずれのストアドプロシージャも DDL ステートメントのみを返し、実行は行いません。返された DDL ステートメントを実行した後、対象のクエリで使用されるすべての列に有効な IMCI が設定されるまで、無効な列が残っている場合に限り、同じプロシージャを再度実行してください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
PolarDB for MySQL 8.0.1 クラスター(リビジョンバージョン 8.0.1.1.30 以降)
対象テーブルに対する SELECT 権限
操作手順
IMCI を適用する範囲に応じて、以下のいずれかのプロシージャを選択してください。
| プロシージャ | 適用範囲 | 使用タイミング |
|---|---|---|
dbms_imci.columnar_advise() | クエリ対象テーブルのすべての列 | クエリが参照するすべてのテーブルに対して、完全な列ストアカバー率を確保したい場合 |
dbms_imci.columnar_advise_by_columns() | クエリで実際に参照される列のみ | クエリで実際に使用される列に限定して、ターゲット型の IMCI を構築したい場合 |
構文
クエリ対象テーブルのすべての列に対して IMCI を作成するための DDL ステートメントを取得します。
CALL dbms_imci.columnar_advise('<query_string>');クエリで参照される特定の列のみに対して IMCI を作成するための DDL ステートメントを取得します。
CALL dbms_imci.columnar_advise_by_columns('<query_string>');パラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
query_string | 文字列リテラル | 解析対象の SQL ステートメントです。SELECT ステートメントである必要があります。INSERT、UPDATE、DELETE ステートメントはサポートされていません。変数やクエリ結果ではなく、文字列リテラルとして指定する必要があります。クエリ内の SELECT ステートメントが存在しない列を参照する場合、エラーが返されます。 |
例
以下の例では、t1 および t2 の 2 つのテーブルを test データベース内に使用します。
サンプルテーブルの準備:
USE test;
CREATE TABLE t1 (a INT, b INT) ENGINE = InnoDB;
CREATE TABLE t2 (a INT, b INT) ENGINE = InnoDB;クエリ対象テーブルのすべての列に対する DDL の取得
対象クエリを引数として 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');実行結果の例:
+-------------------------------------------+
| DDL_STATEMENT |
+-------------------------------------------+
| ALTER TABLE test.t1 COMMENT='COLUMNAR=1'; |
| ALTER TABLE test.t2 COMMENT='COLUMNAR=1'; |
+-------------------------------------------+
2 rows in set (0.00 sec)出力には、各テーブルごとに 1 行の DDL ステートメントが含まれます。各ステートメントは、対象テーブルのすべての列に対して IMCI を有効化します。これらのステートメントを実行して、IMCI を作成してください。
クエリで参照される特定の列に対する DDL の取得
同一のクエリを引数として dbms_imci.columnar_advise_by_columns() を呼び出します。
CALL dbms_imci.columnar_advise_by_columns('SELECT COUNT(t1.a) FROM t1 INNER JOIN t2 ON t1.a = t2.a GROUP BY t1.b');実行結果の例:
+-------------------------------------------------------------------------------------------------------------------------------------------+
| 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)このクエリでは t1.a、t1.b、t2.a のみが参照されるため、出力される DDL ステートメントはこれら 3 列に対する IMCI の作成のみを対象としています。これらのステートメントを実行して、クエリで実際に使用される列にのみ IMCI を有効化してください。
すべての列が有効になるまで繰り返す
DDL ステートメントを実行した後、一部の列の IMCI 状態が依然として無効である場合があります。その場合は、同一のクエリで同じストアドプロシージャを再度呼び出し、更新された DDL ステートメントを取得して実行してください。この処理を、ストアドプロシージャが追加のステートメントを返さなくなり、かつクエリで使用されるすべての列に対して IMCI が有効になるまで繰り返します。