Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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