Amazon Aurora DSQL はプレビューサービスとして提供されています。詳細については、「AWS サービス規約」の「ベータ版とプレビュー
Aurora DSQL の非同期インデックス
CREATE INDEX ASYNC
コマンドは、指定されたテーブルの列にインデックスを作成します。CREATE INDEX ASYNC
は非同期 DDL オペレーションであるため、このコマンドは他のトランザクションをブロックしません。
このコマンドを実行すると、Aurora DSQL はすぐに job_id
を返します。非同期ジョブのステータスは、sys.jobs
システムビューでいつでも確認できます。
インデックス作成ジョブが進行中の場合は、次のプロシージャとコマンドを使用できます。
sys.wait_for_job(job_id)
-
指定されたジョブが完了または失敗するまでセッションをブロックします。このプロシージャでは、ブール値を返します。
DROP INDEX
-
進行中のインデックスビルドジョブをキャンセルします。
Aurora DSQL が非同期インデックスタスクを完了すると、システムカタログが更新され、インデックスがアクティブであることが示されます。この時点で他のトランザクションが同じ名前空間内のオブジェクトを参照している場合、同時実行エラーが表示されることがあります。
構文
CREATE INDEX ASYNC
は以下の構文を使用します。
CREATE [ UNIQUE ] INDEX ASYNC [ IF NOT EXISTS ] name ON table_name ( { column_name } [ NULLS { FIRST | LAST } ] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]
パラメータ
UNIQUE
-
Aurora DSQL がインデックスを作成する際、およびデータを追加するたびに、テーブル内の重複した値をチェックすることを示します。このパラメータを指定した場合、エントリが重複するオペレーションを挿入および更新すると、エラーが発生します。
IF NOT EXISTS
-
同じ名前のインデックスが既に存在する場合、Aurora DSQL が例外をスローすべきではないことを示します。この場合、Aurora DSQL は新しいインデックスを作成しません。作成しようとしているインデックスは、存在するインデックスとは大きく異なる構造を持つ可能性があることに注意してください。このパラメータを指定する場合、インデックス名は必須です。
name
-
インデックスの名前。このパラメータにスキーマの名前を含めることはできません。
Aurora DSQL は、親テーブルと同じスキーマにインデックスを作成します。インデックスの名前は、スキーマ内のテーブルやインデックスなどの他のオブジェクトの名前とは異なる必要があります。
名前を指定しない場合、Aurora DSQL は親テーブルとインデックス付き列の名前に基づいて名前を自動的に生成します。例えば、
CREATE INDEX ASYNC on table1 (col1, col2)
を実行すると、Aurora DSQL は自動的にインデックスtable1_col1_col2_idx
に名前を付けます。 NULLS FIRST | LAST
-
null 列と null 列以外の列のソート順。
FIRST
は、Aurora DSQL が null 列以外の列の前に null 列をソートする必要があることを示します。LAST
は、Aurora DSQL が null 列以外の列の後に null 列をソートする必要があることを示します。 INCLUDE
-
非キー列としてインデックスに含める列のリスト。インデックススキャン検索条件にキー以外の列を使用することはできません。Aurora DSQL は、インデックスの一意性の観点から列を無視します。
NULLS DISTINCT | NULLS NOT DISTINCT
-
Aurora DSQL が一意のインデックスで null 値を個別と見なすかどうかを指定します。デフォルトは
DISTINCT
です。つまり、一意のインデックスには列に複数の null 値を含めることができます。NOT DISTINCT
は、インデックスが列に複数の null 値を含めることができないことを示します。
使用に関する注意事項
以下のガイドラインを検討します。
-
CREATE INDEX ASYNC
コマンドはロックを導入しません。また、Aurora DSQL がインデックスの作成に使用するベーステーブルにも影響しません。 -
スキーマ移行オペレーション中は、
sys.wait_for_job(job_id)
のプロシージャが役立ちます。これにより、後続の DDL および DML オペレーションが新しく作成されたインデックスをターゲットにします。 -
Aurora DSQL は、新しい非同期タスクを実行するたびに、
sys.jobs
ビューをチェックし、30 分以上ステータスがcompleted
またはfailed
のタスクを削除します。したがって、sys.jobs
では主に進行中のタスクが表示され、古いタスクに関する情報は含まれません。 -
Aurora DSQL が非同期インデックスの構築に失敗した場合、インデックスは
INVALID
のままになります。一意のインデックスの場合、インデックスを削除するまで、DML オペレーションは一意性の制約を受けます。無効なインデックスを削除して再作成することをお勧めします。
インデックスの作成: 例
次の例は、スキーマ、テーブル、インデックスを作成する方法を示しています。
-
test.departments
という名前のテーブルを作成します。CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key not null, manager varchar(255), size varchar(4));
-
テーブルに行を挿入します。
INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
-
非同期インデックスを作成します。
CREATE INDEX ASYNC test_index on test.departments(name, manager, size);
CREATE INDEX
コマンドは、次に示すようにジョブ ID を返します。job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y
job_id
は、Aurora DSQL がインデックスを作成するための新しいジョブを送信したことを示します。sys.wait_for_job(job_id)
のプロシージャを使用して、ジョブが終了またはタイムアウトするまでセッションの他の作業をブロックできます。
インデックス作成のステータスのクエリ: 例
次の例に示すように、sys.jobs
システムビューをクエリしてインデックスの作成ステータスを確認します。
SELECT * FROM sys.jobs
Aurora DSQL は、次のようなレスポンスを返します。
job_id | status | details ----------------------------+------------+--------- vs3kcl3rt5ddpk3a6xcq57cmcy | completed | ihbyw2aoirfnrdfoc4ojnlamoq | processing |
[status] 列には、次のいずれかの値を指定することができます。
submitted
-
タスクは送信されましたが、Aurora DSQL はまだタスクの処理を開始していません。
processing
-
Aurora DSQL はタスクを処理しています。
failed
-
タスクが失敗しました。詳細については、[details] 列を参照してください。Aurora DSQL がインデックスの構築に失敗した場合、Aurora DSQL ではインデックス定義を自動的に削除しません。
DROP INDEX
コマンドを使用してインデックスを手動で削除する必要があります。 completed
-
Aurora DSQL
カタログテーブル pg_index
および pg_class
を使用して、インデックスの状態をクエリすることもできます。具体的には、属性 indisvalid
と indisimmediate
により、インデックスの状態を知ることができます。Aurora DSQL がインデックスを作成する間、初期ステータスは INVALID
です。インデックスの indisvalid
フラグは、FALSE
または f
を返します。これはインデックスが有効でないことを示します。フラグが TRUE
または t
を返すと、インデックスは準備完了です。
select relname as index_name, indisvalid as is_valid, pg_get_indexdef(indexrelid) as index_definition from pg_index, pg_class where pg_class.oid = indexrelid and indrelid = 'test.departments'::regclass;
index_name | is_valid | index_definition ------------------+----------+------------------------------------------------------------------------------------------------------------------- department_pkey | t | CREATE UNIQUE INDEX department_pkey ON test.departments USING btree_index (title) INCLUDE (name, manager, size) test_index1 | t | CREATE INDEX test_index1 ON test.departments USING btree_index (name, manager, size)
インデックスの状態のクエリ: 例
カタログテーブル pg_index
および pg_class
を使用して、インデックスの状態をクエリできます。具体的には、属性 indisvalid
と indisimmediate
はインデックスの状態を示します。次の例は、クエリと結果のサンプルです。
SELECT relname AS index_name, indisvalid AS is_valid, pg_get_indexdef(indexrelid) AS index_definition FROM pg_index, pg_class WHERE pg_class.oid = indexrelid AND indrelid = 'test.departments'::regclass; index_name | is_valid | index_definition ------------------+----------+------------------------------------------------------------------------------------------------------------------- department_pkey | t | CREATE UNIQUE INDEX department_pkey ON test.departments USING btree_index (title) INCLUDE (name, manager, size) test_index1 | t | CREATE INDEX test_index1 ON test.departments USING btree_index (name, manager, size)
Aurora DSQL がインデックスを作成する間、初期ステータスは INVALID
です。インデックスの indisvalid
列には、インデックスが有効でないことを示す FALSE
または f
が表示されます。列に TRUE
または t
が表示されていると、インデックスは準備完了です。
indisunique
フラグは、インデックスが UNIQUE
であることを示します。テーブルが同時書き込みの一意性チェックの対象であるかどうかを確認するには、以下のクエリのように、pg_index
の indimmediate
列をクエリします。
SELECT relname AS index_name, indimmediate AS check_unique, pg_get_indexdef(indexrelid) AS index_definition FROM pg_index, pg_class WHERE pg_class.oid = indexrelid AND indrelid = 'test.departments'::regclass; index_name | check_unique | index_definition ------------------+----------+------------------------------------------------------------------------------------------------------------------- department_pkey | t | CREATE UNIQUE INDEX department_pkey ON test.departments USING btree_index (title) INCLUDE (name, manager, size) test_index1 | f | CREATE INDEX test_index1 ON test.departments USING btree_index (name, manager, size)
列に f
が表示され、ジョブのステータスが processing
である場合、インデックスはまだ作成中です。インデックスへの書き込みは一意性チェックの対象ではありません。列に t
が表示され、ジョブのステータスが processing
である場合、初期インデックスは構築されていますが、インデックス内のすべての行で一意性チェックが実行されていません。ただし、インデックスへの現在および将来のすべての書き込みについて、Aurora DSQL は一意性チェックを実行します。