インデックス作成メトリックを有効にする
インデックスとインデックス作成ポリシーが、自分が作成した SQL クエリに実際どのような影響を与えるのか、ふと気になることはないでしょうか。 Azure Cosmos DB for NoSQL には、現在のインデックスの状態がクエリ フィルターにどう影響しているかを明らかにするオプトインのインデックス作成メトリックが含まれています。 それだけではありません。将来のクエリ パフォーマンスを高めるためには、単一インデックスにすべきか複合インデックスにすべきか、その点もインデックス作成メトリックから明らかになります。
コンテナー内のすべての項目を選択する場合に標準的なクエリ要求は、.NET 用の Azure Cosmos DB for NoSQL を使用して作成できます。
Container container = client.GetContainer("cosmicworks", "products");
string sql = "SELECT * FROM products p";
QueryDefinition query = new(sql);
FeedIterator<Product> iterator = container.GetItemQueryIterator<Product>(query);
while(iterator.HasMoreResults)
{
FeedResponse<Product> response = await iterator.ReadNextAsync();
foreach(Product product in response)
{
Console.WriteLine($"[{product.id}]\t{product.name,35}\t{product.price,15:C}");
}
}
このサンプル コードでは、SQL クエリで QueryDefinition 変数を作成した後、Container クラスの GetItemQueryIterator<> メソッドにその変数を渡しています。 このコードは、反復子を取得した後、while ループと foreach ループの組み合わせを使用してページを反復処理します。反復処理は、後続に結果のページがある限り続きます。
インデックスのメトリックを有効にするには、まず QueryRequestOptions 型のオブジェクトを作成し、PopulateIndexMetrics プロパティを true に設定します。
注意
既定では、PopulateIndexMetrics が無効になっています。 これを有効にするのは、クエリ パフォーマンスのトラブルシューティングを行う場合、または、インデックス作成ポリシーをどう変更すべきか確信が持てない場合のみとしてください。
QueryRequestOptions options = new()
{
PopulateIndexMetrics = true
};
作成した options 変数は、追加のパラメーターとして、Container クラスの GetItemQueryIterator<> メソッドに渡すことができます。
FeedIterator<Product> iterator = container.GetItemQueryIterator<Product>(query, requestOptions: options);
次に、while ループと foreach ループを組み合わせて普通に結果を反復処理できます。 ただし、現在のインデックスに対するクエリのパフォーマンスに関する情報を含んだ IndexMetrics 文字列プロパティは、while ループ内の FeedResponse<> オブジェクトに格納されます。
この例では、IndexMetrics プロパティの内容をコンソール出力に送っています。
while(iterator.HasMoreResults)
{
FeedResponse<Product> response = await iterator.ReadNextAsync();
foreach(Product product in response)
{
// Do something with each product
}
Console.WriteLine(response.IndexMetrics);
}