Query Advisor för Cosmos DB

Cosmos DB har nu Query Advisor som hjälper dig att skriva snabbare och effektivare frågor med hjälp av Cosmos DB-frågespråket. Oavsett om du optimerar för prestanda, kostnad eller skalbarhet ger Query Advisor användbara rekommendationer som hjälper dig att få ut mesta möjliga av dina data i Azure och Microsoft Fabric.

Varför frågeoptimering är viktigt

Frågespråket för Cosmos DB (i Azure och Fabric) är flexibelt, så att utvecklare kan köra frågor mot JSON-data med välbekant SQL-liknande syntax. I takt med att programmen växer i komplexitet kan små skillnader i frågestrukturen ha en betydande effekt på prestanda- och begärandeenheter (RU:er), särskilt i stor skala.

Två frågor som returnerar samma resultat kan till exempel variera dramatiskt i effektivitet baserat på hur predikat skrivs och hur index tillämpas.

Query Advisor analyserar dina frågor och erbjuder riktade rekommendationer som hjälper dig:

  • Minska RU-kostnaderna genom att identifiera ineffektiva uttryck eller onödiga filter.
  • Förbättra frågeprestanda genom mer optimala frågestrukturer.
  • Förstå "varför" bakom varje förslag, med förklaringar skrivna på ett tydligt, utvecklarvänligt språk.

Så här fungerar det

När du kör en fråga körs Query Advisor över din frågeplan, utvärderar mönster som kan orsaka hög RU-förbrukning, överdriven genomsökning eller potentiellt onödig bearbetning. Den returnerar sedan en uppsättning rekommendationer som anger vilken del av frågan som kan begränsa prestanda och föreslår potentiella ändringar som kan hjälpa.

Använda Query Advisor

Du kan aktivera Query Advisor-funktioner genom att ange PopulateQueryAdvice egenskapen i QueryRequestOptions till true. När det inte anges PopulateQueryAdvice är standardvärdet false. Om du vill komma åt råden använder du strängegenskapen FeedResponse.QueryAdvice.

Viktigt!

Query Advisor fungerar bara med .NET SDK för Cosmos DB. Frågeråden returneras också endast vid den första tur och retur-resan. Rådgivningen är inte tillgänglig vid efterföljande fortsättningssamtal.

Tänk på den här exempelfrågan:

SELECT VALUE
    r.id
FROM
    root r
WHERE
    CONTAINS(r.name, 'Abc')

Här är ett exempel på en SDK-begäran som utför den här frågan och använder Query Advisor:

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);

Den här begäran returnerar en enda rådgivningsinstruktur för QA1002:

QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]

Frågeråden innehåller tre viktiga uppgifter:

  • Frågeråds-ID:t: QA1002
  • Beskrivning av råd: I det här exemplet If you are matching on a string prefix, consider using STARTSWITH.
  • Länken till dokumentationen: En URL till detaljerad vägledning

Anmärkning

Länken till dokumentationen utelämnades från det här exemplet.

Examples

Tänk dig följande exempel på scenarier där du kan använda Query Advisor.

Optimera systemfunktionsanvändning

Tänk dig det här exemplet där GetCurrentTimestamp funktionen används:

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

I det här exemplet finns det två råd som returneras av Query Advisor: QA1008 och QA1009. Varje råd delas upp i en ny rad i strängutdata.

QA1009: Consider using GetCurrentTimestampStatic instead of GetCurrentTimestamp in the WHERE clause. [...]
QA1008: Consider using GetCurrentTicksStatic instead of GetCurrentTicks in the WHERE clause. [...]

Med hjälp av det här rådet kan du skriva om frågan till följande alternativ:

SELECT
    GetCurrentTicksStatic() 
FROM
    container c
WHERE
    GetCurrentTimestampStatic() > 10