翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
インデックスの管理
重要
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL
このセクションでは、Amazon でインデックスを作成、説明、削除する方法について説明しますQLDB。作成できるテーブルあたりのインデックス数のクォータは、Amazon のクォータと制限 QLDB で定義されます。
インデックスの作成
で説明されているようにテーブルとインデックスの作成、 CREATEINDEXステートメントを使用して、次のように、指定した最上位フィールドのテーブルにインデックスを作成できます。テーブル名とインデックス付きフィールド名は、大文字と小文字を区別します。
CREATE INDEX ON VehicleRegistration (VIN)
CREATE INDEX ON VehicleRegistration (LicensePlateNumber)
テーブルで作成する各インデックスには、システムによって割り当てられた一意の ID があります。このインデックス ID を検索するには、次のセクション「インデックスの説明」を参照してください。
重要
QLDB では、ドキュメントを効率的に検索するためにインデックスが必要です。インデックスがない場合、 はドキュメントを読み取るときに完全なテーブルスキャンを実行QLDBする必要があります。これにより、同時実行の競合やトランザクションのタイムアウトなど、大きなテーブルでパフォーマンスの問題が発生する可能性があります。
テーブルスキャンを回避するには、インデックス付きフィールドまたはドキュメント ID で等価演算子 (=
または IN
) を使用する WHERE
述語句でステートメントを実行する必要があります。詳細については、「クエリパフォーマンスの最適化」を参照してください。
インデックスを作成する際には、以下の制約があることに注意してください。
-
インデックスは 1 つのトップレベルフィールドでのみ作成できます。複合、ネスト、一意、および関数ベースのインデックスはサポートされていません。
-
任意の Ion データ型 (
list
、struct
など) でインデックスを作成できます。ただし、Ion のデータ型に関わらず、Ion 値全体の等価によってインデックス付けされたルックアップのみを実行できます。例えば、list
型をインデックスとして使用すると、リスト内の 1 つの項目でインデックス付けされたルックアップは実行できません。 -
クエリのパフォーマンスは、等価述語 (
WHERE indexedField = 123
、WHERE indexedField IN (456, 789)
など) を使用する場合にのみ向上します。QLDB は、クエリ述語の不等式を尊重しません。そのため、範囲でフィルタリングされるスキャンは実装されていません。
-
インデックス付きフィールドの名前は大文字と小文字の区別があり 128 文字以下で指定します。
-
でのインデックスの作成QLDBは非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。詳細については、「インデックスの管理」を参照してください。
インデックスの説明
でのインデックスの作成QLDBは非同期です。空でないテーブルでのインデックスの作成を完了するのにかかる時間は、テーブルサイズによって異なります。インデックス構築のステータスを確認するには、システムカタログテーブル information_schema.user_tables のクエリを実行します。
例えば、次のステートメントは、VehicleRegistration
テーブルのすべてのインデックスに対してシステムカタログのクエリを実行します。
SELECT VALUE indexes FROM information_schema.user_tables info, info.indexes indexes WHERE info.name = 'VehicleRegistration'
{ indexId: "Djg2nt0yIs2GY0T29Kud1z", expr: "[VIN]", status: "ONLINE" }, { indexId: "4tPW3fUhaVhDinRgKRLhGU", expr: "[LicensePlateNumber]", status: "FAILED", message: "aws.ledger.errors.InvalidEntityError: Document contains multiple values for indexed field: LicensePlateNumber" }
インデックスフィールド
-
indexId
: インデックスの一意の ID。 -
expr
: インデックス付きドキュメントパス。このフィールドは、[fieldName]
形式の文字列です。 -
status
: インデックスの現在のステータス。インデックスのステータスは以下のいずれかの値になります。-
BUILDING
: テーブルのインデックスをアクティブに構築しています。 -
FINALIZING
: インデックスの構築が完了し、使用するためにアクティブ化を開始しています。 -
ONLINE
: アクティブになっていて、クエリで使用できる状態です。QLDB ステータスがオンラインになるまで、 はクエリでインデックスを使用しません。 -
FAILED
: 回復不能なエラーのため、インデックスを構築できません。この状態のインデックスは、テーブルあたりのインデックスのクォータにそのまま不利に作用します。詳細については、「一般的なエラー」を参照してください。 -
DELETING
: ユーザーがインデックスを削除した後、インデックスをアクティブに削除します。
-
-
message
: インデックスにFAILED
ステータスがある理由を説明するエラーメッセージ。このフィールドは、失敗したインデックスにのみ含まれます。
を使用してインデックスのステータス AWS Management Console を確認することもできます。
インデックスのステータスを確認するには (コンソール)
にサインインし AWS Management Console、https://console.aws.amazon.com/qldb
で Amazon QLDBコンソールを開きます。 -
ナビゲーションペイン内で [Ledgers (台帳)] を選択します。
-
[Ledgers] (台帳) リストで、インデックスを管理する台帳の名前を選択します。
-
台帳の詳細ページの [Tables] (テーブル) タブで、インデックスを確認するテーブル名を選択します。
-
テーブルの詳細ページで、[Indexed fields] (インデックス付きフィールド) カードを見つけます。[Index status] (インデックス ステータス) 列に、テーブルの各インデックスの現在のステータスが表示されます。
インデックスの削除
DROP INDEX ステートメントを使用して、インデックスを削除します。インデックスを削除すると、テーブルから完全に削除されます。
まず、information_schema.user_tables
からインデックス ID を見つけます。例えば、次のクエリは、VehicleRegistration
テーブルでインデックス付き LicensePlateNumber
フィールドの indexId
を返します。
SELECT indexes.indexId FROM information_schema.user_tables info, info.indexes indexes WHERE info.name = 'VehicleRegistration' and indexes.expr = '[LicensePlateNumber]'
次に、この ID を使用してインデックスを削除します。以下は、インデックス ID 4tPW3fUhaVhDinRgKRLhGU
を削除する例です。インデックス ID は一意の識別子であり、二重引用符で囲まれています。
DROP INDEX "4tPW3fUhaVhDinRgKRLhGU" ON VehicleRegistration WITH (purge = true)
注記
WITH (purge = true)
句はすべての DROP
INDEX
ステートメントに必要です。現在 true
のみが値としてサポートされています。
キーワード purge
は大文字と小文字が区別され、すべて小文字にする必要があります。
を使用してインデックス AWS Management Console を削除することもできます。
インデックスを削除するには (コンソール)
にサインインし AWS Management Console、https://console.aws.amazon.com/qldb
で Amazon QLDBコンソールを開きます。 -
ナビゲーションペイン内で [Ledgers (台帳)] を選択します。
-
[Ledgers] (台帳) リストで、インデックスを管理する台帳の名前を選択します。
-
台帳の詳細ページの [Tables] (テーブル) タブで、インデックスを削除するテーブル名を選択します。
-
テーブルの詳細ページで、[Indexed fields] (インデックス付きフィールド) カードを見つけます。削除するインデックスを選択し、[Drop index] (インデックスの削除) を選択します。
一般的なエラー
このセクションでは、インデックスの作成時に発生する可能性のある一般的なエラーについて説明し、考えられる解決策を提案します。
注記
ステータスが FAILED
のインデックスはそのままテーブルあたりのインデックスのクォータに不利に作用します。また、失敗したインデックスによって、テーブルでのインデックス作成が失敗した原因となったドキュメントの変更と削除はできません。
明示的にインデックスを削除してクォータから削除する必要があります。
- ドキュメントには、インデックス付きフィールドの複数の値が含まれています。
fieldName
. -
QLDB テーブルに同じフィールド (重複するフィールド名) に複数の値を持つドキュメントが含まれているため、 は指定されたフィールド名のインデックスを構築できません。
まず、失敗したインデックスを削除する必要があります。次に、インデックスの作成を再試行する前に、テーブル内のすべてのドキュメントが各フィールド名に 1 つの値しか持たないことを確認してください。重複のない別のフィールドのインデックスを作成することもできます。
QLDB は、テーブルで既にインデックスが作成されたフィールドの複数の値を含むドキュメントを挿入しようとすると、このエラーも返します。
- インデックス制限の超過: テーブル
tableName
には既にn
インデックスを作成し、それ以上作成することはできません。 -
QLDB は、失敗したインデックスを含め、テーブルごとに 5 つのインデックスの制限を適用します。新しいインデックスを作成する前に、既存のインデックスを削除する必要があります。
- 識別子を持つインデックスが定義されていません:
indexId
. -
指定したテーブルとインデックス ID の組み合わせに存在しないインデックスを削除しようとしました。既存のインデックスを確認する方法については、「インデックスの説明」を参照してください。