Aurora DSQL の非同期インデックス - Amazon Aurora DSQL

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 オペレーションは一意性の制約を受けます。無効なインデックスを削除して再作成することをお勧めします。

インデックスの作成: 例

次の例は、スキーマ、テーブル、インデックスを作成する方法を示しています。

  1. test.departments という名前のテーブルを作成します。

    CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key not null, manager varchar(255), size varchar(4));
  2. テーブルに行を挿入します。

    INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
  3. 非同期インデックスを作成します。

    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 を使用して、インデックスの状態をクエリすることもできます。具体的には、属性 indisvalidindisimmediate により、インデックスの状態を知ることができます。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 を使用して、インデックスの状態をクエリできます。具体的には、属性 indisvalidindisimmediate はインデックスの状態を示します。次の例は、クエリと結果のサンプルです。

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_indexindimmediate 列をクエリします。

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 は一意性チェックを実行します。