Von Bedeutung
Azure Cosmos DB for NoSQL グローバル セカンダリ インデックスは現在プレビュー段階です。 このプレビューは、サービス レベル アグリーメントなしに提供されます。 現時点では、運用ワークロードにグローバル セカンダリ インデックスを使用することはお勧めしません。 このプレビューの特定の機能は、サポートされない場合や制限される場合があります。 詳細については、「Microsoft Azure プレビューの追加使用条件」を参照してください。
グローバル セカンダリ インデックスでは、異なるパーティション キーを使用してデータを格納することで、クエリの効率が向上します。 グローバル セカンダリ インデックスは読み取り専用コンテナーであり、ソース コンテナーと自動的に同期され、データの永続的なコピーが維持されます。 各インデックス コンテナーには、パーティション キー、インデックス作成ポリシー、要求ユニット (RU) の制限、特定の項目プロパティを選択してカスタマイズできるデータ モデルなど、ソース コンテナーとは異なる独自の設定があります。
活用事例
多くの場合、アプリケーションでは、パーティション キー以外のプロパティを使用してデータのクエリを実行する必要があります。 一部のパーティションにフィルター条件に一致するデータが含まれていない場合でも、これらのクエリはすべてのパーティションで実行する必要があります。 その結果、パーティション キーを含まないクエリはより多くの RU を消費し、待機時間が長くなります。
グローバル セカンダリ インデックスを使用すると、次のことができます。
- 別のパーティション キーを使用してデータを格納し、ソース コンテナーのクロスパーティション クエリを単一パーティション参照に変換します。
- アプリケーションのニーズの変化に応じてクエリを効率的に保つために、既存のコンテナーにグローバル セカンダリ インデックスを追加します。
- ソース コンテナーに対するトランザクション操作に影響を与えずに、グローバル セカンダリ インデックスにベクターまたはフルテキスト検索インデックスを作成するなど、ワークロードのサブセットを分離します。
グローバル セカンダリ インデックスの利点
Azure Cosmos DB グローバル セカンダリ インデックスには、次の利点があります。
- 自動同期: インデックス コンテナーはソース コンテナーと自動的に同期されるため、クライアント アプリケーションでカスタム ロジックが不要になります。
- 最終的な整合性: インデックス コンテナーは、ソースの書き込み待機時間に影響を与えることなく、最終的にソース コンテナーと一致します。
- パフォーマンスの分離: インデックス コンテナーには独自のストレージと RU の制限があり、パフォーマンスの分離が提供されます。
- 最適化された読み取りパフォーマンス: 高度な NoSQL クエリ構文を使用したクエリのサポートにより、読み取りパフォーマンスを最適化するための微調整されたデータ モデル、パーティション キー、およびインデックス作成ポリシー。
- 書き込みパフォーマンスの向上: クライアントはソース コンテナーに書き込むだけで済み、複数コンテナーの書き込み戦略と比較して書き込みパフォーマンスが向上します。
- Read-Only コンテナー: インデックス コンテナーへの書き込みは非同期であり、自動的に管理されます。 クライアント アプリケーションは、インデックス コンテナーに直接書き込む必要はありません。
- 複数のインデックス: 追加のオーバーヘッドなしで、同じソース コンテナーに対して複数のインデックス コンテナーを作成できます。
グローバルセカンダリインデックスの定義
グローバル セカンダリ インデックスの作成は、新しいコンテナーの作成と似ています。ソース コンテナーを指定するためのプロパティと、グローバル セカンダリ インデックス データ モデルを定義するクエリが追加されています。 コンテナーの多くのカスタマイズは、カスタム インデックス作成、ベクター、フルテキスト検索ポリシーなど、グローバル セカンダリ インデックス コンテナーにも適用されます。 グローバル セカンダリ インデックス コンテナーは、トラフィックの急増に対応するために自動調整スループットを利用する必要があります。これにより、ソース コンテナーの更新のためにスロットリングされたり遅れたりすることがなくなります。
グローバル セカンダリ インデックスの各項目には、ソース コンテナー内の項目への 1 対 1 のマッピングがあります。 このマッピングを維持するために、グローバルセカンダリインデックス項目の id
フィールドが自動的に設定されます。 ソース コンテナーからの id
の値は、インデックス コンテナー内で _id
として表されます。
グローバル セカンダリ インデックスの定義に使用されるクエリは、次の制約に従う必要があります。
- SELECT ステートメントを使用すると、JSON ツリー内のプロパティのレベルを 1 つだけプロジェクションできます。または、SELECT * を使用してすべてのプロパティを含めることができます。
- AS を使用したプロパティ名のエイリアシングはサポートされていません。
- クエリに WHERE 句や、JOIN、DISTINCT、GROUP BY、ORDER BY、TOP、OFFSET LIMIT、EXISTS などの他の句を含めることはできません。
- システム関数とユーザー定義関数 (UDF) はサポートされていません。
たとえば、有効なクエリは SELECT c.userName, c.emailAddress FROM c
で、ソース コンテナー userName
からemailAddress
プロパティとc
プロパティを選択します。 このクエリでは、グローバル セカンダリ インデックスのデータ モデルを定義し、各項目のインデックス コンテナーに含まれるプロパティを決定します。 ソース コンテナーと定義クエリは、一度作成した後は変更できません。
グローバル セカンダリ インデックスを作成する方法について説明します。
ヒント
ソース コンテナーを削除する場合は、最初に作成されたすべてのグローバル セカンダリ インデックスを削除する必要があります。
グローバル セカンダリ インデックスの同期
グローバル セカンダリ インデックス コンテナーは、 変更フィードを使用してソース コンテナー内のデータに対する変更と自動的に同期されます。 ソース コンテナーにグローバル セカンダリ インデックスが定義されている場合、変更フィード ジョブが自動的に作成および管理されます。 変更はインデックス コンテナー内のデータに非同期的に反映され、ソース コンテナーへの書き込みには影響しません。 インデックス コンテナーは、アカウントに設定されている 整合性レベル に関係なく、最終的にソース コンテナーと一致します。
変更フィードの読み取りではソース コンテナーから RU が使用され、グローバル セカンダリ インデックスへの書き込みではインデックス コンテナーの RU が使用されます。 両方のコンテナーにプロビジョニングされた RU によって、インデックスのハイドレートと同期の速度が決まります。
複数リージョン アカウントのグローバル セカンダリ インデックス
1 つのリージョンを持つ Azure Cosmos DB アカウントの場合、ソース コンテナーからの変更フィードの読み取りとグローバル セカンダリ インデックス コンテナーへの書き込みが、そのリージョンで行われます。 単一の書き込みリージョンを持つマルチリージョン アカウントでは、変更フィードの読み取りとグローバル セカンダリ インデックスの書き込みが書き込みリージョンで行われます。 複数の書き込みリージョンがあるアカウントでは、変更フィードの読み取りとグローバル セカンダリ インデックスの書き込みが、書き込みリージョンのいずれかで行われます。 アカウントのフェールオーバーがある場合、変更フィードの読み取りとグローバル セカンダリ インデックスの書き込みが新しい書き込みリージョンで発生します。
グローバル セカンダリ インデックスのクエリ
グローバル セカンダリ インデックスからのデータのクエリは、他のコンテナーからのデータのクエリに似ています。 完全で豊富な Azure Cosmos DB for NoSQL クエリ構文を使用して、グローバル セカンダリ インデックス コンテナーに対してクエリを実行できます。 これには、ベクター検索、フルテキスト検索、ハイブリッド検索クエリが含まれます。 他のコンテナーと同様に、クエリ パターンに基づいてグローバル セカンダリ インデックス コンテナーの インデックス作成ポリシーを調整 する必要があります。
グローバル セカンダリ インデックスはソース コンテナーとは異なるパーティション キーを持つ可能性があるため、グローバル セカンダリ インデックスに対してクロスパーティション クエリを実行する方が効率的であり、待機時間と RU の両方を節約できます。
モニタリング
Azure portal のメトリックのグローバル セカンダリ インデックスのキャッチアップ ギャップ (分単位) メトリックを使用して、グローバル セカンダリ インデックスを構築する際のラグを監視できます。 これらのメトリックの詳細については、「サポート対象の Microsoft.DocumentDB/DatabaseAccounts のメトリック」を参照してください。
一般的な問題のトラブルシューティング
ソース コンテナーとインデックス コンテナーの間のラグを理解したい
グローバル セカンダリ インデックスのキャッチアップ ギャップ (分単位) メトリックは、ソース コンテナー内のデータとグローバル セカンダリ インデックス コンテナーの間の最大差を分単位で示します。 個別のインデックス コンテナーのラグを表示するには、[ 分割の適用 ] を選択した後、[ 〜によって分割 ] を選択し、[ GlobalSecondaryIndexName ] を選択します。
グローバル セカンダリ インデックス コンテナーに十分な RU があるかどうかを理解したい
ソース コンテナーとインデックス コンテナーでプロビジョニングされた RU は、グローバル セカンダリ インデックス コンテナーに反映される変更率に影響します。 正規化された RU 消費量メトリックを確認してください。高すぎる場合は、コンテナーに最大 RU を増やすことでメリットがあるかもしれません。
制限事項
Azure Cosmos DB for NoSQL API グローバル セカンダリ インデックス機能には、いくつかの制限があります。
- グローバル セカンダリ インデックスを有効にする前に、アカウントで継続的バックアップを有効にする必要があります。
- グローバル セカンダリ インデックス コンテナーは、アカウントの復元プロセス中に自動的に復元されません。 復元プロセスが完了した後、復元されたアカウントでグローバル セカンダリ インデックス機能を有効にする必要があります。 その後、グローバル セカンダリ インデックスをもう一度作成できます。