Cosmos DB 現在具有查詢顧問,旨在協助您使用 Cosmos DB 查詢語言撰寫更快、更有效率的查詢。 無論您是針對效能、成本或延展性進行最佳化,查詢顧問都會提供可採取動作的建議,協助您充分利用 Azure 和 Microsoft Fabric 的資料。
為什麼查詢優化很重要
Cosmos DB (在 Azure 和 Fabric) 的查詢語言很靈活,可讓開發人員使用熟悉的類似 SQL 的語法來查詢 JSON 資料。 隨著應用程式複雜度的增加,查詢結構的微小差異可能會對效能和要求單位 (RU) 產生重大影響,尤其是在大規模時。
例如,根據述詞的撰寫方式和索引的套用方式,傳回相同結果的兩個查詢在效率上可能會有很大差異。
查詢顧問會分析您的查詢,並提供有針對性的建議,以協助您:
- 透過識別低效運算式或不必要的篩選來降低 RU 成本。
- 透過更優化的查詢結構來改善查詢效能。
- 了解每個建議背後的“原因”,並以清晰、開發人員友好的語言編寫解釋。
運作方式
當您執行查詢時,查詢顧問會執行您的查詢計劃,評估可能導致高 RU 耗用量、過多掃描或潛在不必要處理的模式。 然後,它會傳回一組建議,指出查詢的哪個部分可能會限制效能,並建議可能有所幫助的潛在變更。
使用查詢顧問
您可以將 中的QueryRequestOptions內容設定PopulateQueryAdvice為 true來啟用 Query Advisor 功能。 如果未指定, PopulateQueryAdvice 則預設為 false。 若要存取建議,請使用字串屬性 FeedResponse.QueryAdvice。
這很重要
查詢顧問僅適用於適用於 Cosmos DB 的 .NET SDK。 查詢建議也只會在第一次來回時傳回。 該建議在後續的繼續電話中不可用。
請考慮以下範例查詢:
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
以下是執行此查詢並使用 Query Advisor 的 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:
QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]
查詢建議包含三個重要資訊:
-
查詢建議 ID:
QA1002 -
建議描述:在此範例中,
If you are matching on a string prefix, consider using STARTSWITH. - 文件連結:詳細指引的 URL
備註
此範例省略了文件的連結。
範例
請考慮下列您可以使用查詢顧問的案例範例。
優化系統功能使用
請考慮使用函數的 GetCurrentTimestamp 範例:
SELECT
GetCurrentTicks()
FROM
container c
WHERE
GetCurrentTimestamp() > 10
在此範例中,Query Advisor 會傳回兩個建議: QA1008 和 QA1009。 每條建議在字串輸出中分成新行。
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