共用方式為


適用於 Cosmos DB 的查詢顧問

Cosmos DB 現在具有查詢顧問,旨在協助您使用 Cosmos DB 查詢語言撰寫更快、更有效率的查詢。 無論您是針對效能、成本或延展性進行最佳化,查詢顧問都會提供可採取動作的建議,協助您充分利用 Azure 和 Microsoft Fabric 的資料。

為什麼查詢優化很重要

Cosmos DB (在 Azure 和 Fabric) 的查詢語言很靈活,可讓開發人員使用熟悉的類似 SQL 的語法來查詢 JSON 資料。 隨著應用程式複雜度的增加,查詢結構的微小差異可能會對效能和要求單位 (RU) 產生重大影響,尤其是在大規模時。

例如,根據述詞的撰寫方式和索引的套用方式,傳回相同結果的兩個查詢在效率上可能會有很大差異。

查詢顧問會分析您的查詢,並提供有針對性的建議,以協助您:

  • 透過識別低效運算式或不必要的篩選來降低 RU 成本
  • 透過更優化的查詢結構來改善查詢效能
  • 了解每個建議背後的“原因”,並以清晰、開發人員友好的語言編寫解釋。

運作方式

當您執行查詢時,查詢顧問會執行您的查詢計劃,評估可能導致高 RU 耗用量、過多掃描或潛在不必要處理的模式。 然後,它會傳回一組建議,指出查詢的哪個部分可能會限制效能,並建議可能有所幫助的潛在變更。

使用查詢顧問

您可以將 中的QueryRequestOptions內容設定PopulateQueryAdvicetrue來啟用 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. [...]

查詢建議包含三個重要資訊:

  • 查詢建議 IDQA1002
  • 建議描述:在此範例中, If you are matching on a string prefix, consider using STARTSWITH.
  • 文件連結:詳細指引的 URL

備註

此範例省略了文件的連結。

範例

請考慮下列您可以使用查詢顧問的案例範例。

優化系統功能使用

請考慮使用函數的 GetCurrentTimestamp 範例:

SELECT
    GetCurrentTicks() 
FROM
    container c
WHERE
    GetCurrentTimestamp() > 10

在此範例中,Query Advisor 會傳回兩個建議: QA1008QA1009。 每條建議在字串輸出中分成新行。

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