Cosmos DB では、Cosmos DB クエリ言語を使用して、より高速で効率的なクエリを記述できるように設計されたクエリ アドバイザーが機能するようになりました。 パフォーマンス、コスト、スケーラビリティに最適化しているかどうかにかかわらず、Query Advisor には、Azure と Microsoft Fabric 全体のデータを最大限に活用するための実用的な推奨事項が用意されています。
クエリの最適化が重要な理由
Cosmos DB のクエリ言語 (Azure と Fabric) は柔軟性が高く、開発者は使い慣れた SQL に似た構文を使用して JSON データにクエリを実行できます。 アプリケーションの複雑さが増すにつれて、クエリ構造の小さな違いがパフォーマンスと要求ユニット (RU) に大きな影響を与える可能性があります。特に大規模です。
たとえば、同じ結果を返す 2 つのクエリは、述語の書き込み方法とインデックスの適用方法に基づいて、効率が大幅に異なる場合があります。
クエリ アドバイザーはクエリを分析し、次の目的に合った推奨事項を提供します。
- 非効率的な式または不要なフィルターを特定することで、RU コストを削減します。
- 最適なクエリ構造を使用してクエリのパフォーマンスを向上させます。
- 開発者にわかりやすい明確な言語で記述された説明を使用して、各提案の背後にある "理由" を理解します。
動作方法
クエリを実行すると、クエリ アドバイザーはクエリ プランを実行し、RU 消費量が多い、過剰なスキャン、または潜在的に不要な処理を引き起こす可能性のあるパターンを評価します。 次に、クエリのどの部分がパフォーマンスを制限するかを示す一連の推奨事項を返し、役立つ可能性のある潜在的な変更を提案します。
クエリ アドバイザーの使用
クエリ アドバイザー機能を有効にするには、QueryRequestOptionsの PopulateQueryAdvice プロパティを true に設定します。 指定しない場合、 PopulateQueryAdvice は既定で false に設定されます。 アドバイスにアクセスするには、文字列プロパティ FeedResponse.QueryAdviceを使用します。
Important
クエリ アドバイザーは、.NET SDK for Cosmos DB でのみ機能します。 クエリのアドバイスは、最初のラウンド トリップでのみ返されます。 このアドバイスは、後続の継続呼び出しでは使用できません。
次のクエリ例を考えてみましょう。
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
このクエリを実行し、クエリ アドバイザーを使用する SDK 要求の例を次に示します。
using Microsoft.Azure.Cosmos;
CosmosClient client = new("<connection-string>");
Container container = client.GetContainer("<database-name>", "<container-name>");
string query = """
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
""";
QueryRequestOptions requestOptions = new()
{
PopulateQueryAdvice = true
};
using FeedIterator<dynamic> itemQuery = container.GetItemQueryIterator<dynamic>(
query,
requestOptions: requestOptions);
string? queryAdvice = null;
while (itemQuery.HasMoreResults)
{
if (queryAdvice is not null)
{
break;
}
FeedResponse<dynamic> page = await itemQuery.ReadNextAsync();
queryAdvice = page.QueryAdvice;
}
Console.WriteLine(queryAdvice);
この要求は、 QA1002に関する 1 つのアドバイス ステートメントを返します。
QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]
クエリのアドバイスには、次の 3 つの重要な情報が含まれています。
-
クエリ アドバイス ID:
QA1002 -
アドバイスの説明: この例では、
If you are matching on a string prefix, consider using STARTSWITH. - ドキュメントへのリンク: 詳細なガイダンスへの URL
注
この例では、ドキュメントへのリンクを省略しました。
例示
クエリ アドバイザーを使用できるシナリオの例を次に示します。
システム機能の使用の最適化
GetCurrentTimestamp関数を使用する例を次に示します。
SELECT
GetCurrentTicks()
FROM
container c
WHERE
GetCurrentTimestamp() > 10
この例では、クエリ アドバイザーから返されるアドバイスには、 QA1008 と QA1009の 2 つがあります。 アドバイスの各部分は、文字列出力の新しい行に分割されます。
QA1009: Consider using GetCurrentTimestampStatic instead of GetCurrentTimestamp in the WHERE clause. [...]
QA1008: Consider using GetCurrentTicksStatic instead of GetCurrentTicks in the WHERE clause. [...]
このアドバイスを使用して、クエリを次の代替方法に書き換える場合があります。
SELECT
GetCurrentTicksStatic()
FROM
container c
WHERE
GetCurrentTimestampStatic() > 10