Freigeben über


Abfrageratgeber für Cosmos DB

Cosmos DB bietet jetzt Abfrageratgeber, der Ihnen dabei hilft, schneller und effizientere Abfragen mithilfe der Cosmos DB-Abfragesprache zu schreiben. Ganz gleich, ob Sie für Leistung, Kosten oder Skalierbarkeit optimieren, abfrageratgeber bietet handlungsfähige Empfehlungen, die Ihnen helfen, Ihre Daten in Azure und Microsoft Fabric optimal zu nutzen.

Warum die Abfrageoptimierung wichtig ist

Die Abfragesprache für Cosmos DB (in Azure und Fabric) ist flexibel, sodass Entwickler JSON-Daten mit vertrauter SQL-ähnliche Syntax abfragen können. Da Anwendungen komplexer werden, können kleine Unterschiede in der Abfragestruktur erhebliche Auswirkungen auf die Leistung und Anforderungseinheiten (RUs) haben, insbesondere im großen Maßstab.

Beispielsweise könnten sich zwei Abfragen, die dasselbe Ergebnis zurückgeben, erheblich in der Effizienz unterscheiden, je nachdem, wie Prädikate geschrieben werden und wie Indizes angewendet werden.

Der Abfrageratgeber analysiert Ihre Abfragen und bietet gezielte Empfehlungen, die Ihnen helfen:

  • Reduzieren Sie RU-Kosten , indem Sie ineffiziente Ausdrücke oder unnötige Filter identifizieren.
  • Verbessern Sie die Abfrageleistung durch optimale Abfragestrukturen.
  • Verstehen Sie das "Warum" hinter jedem Vorschlag, mit Erklärungen, die in klarer, entwicklerfreundlicher Sprache geschrieben sind.

Funktionsweise

Wenn Sie eine Abfrage ausführen, wird der Abfrageratgeber über Ihren Abfrageplan ausgeführt, und es werden Muster ausgewertet, die zu einem hohen RU-Verbrauch, zu übermäßigen Scans oder potenziell unnötiger Verarbeitung führen können. Anschließend wird eine Reihe von Empfehlungen zurückgegeben, die angeben, welcher Teil der Abfrage die Leistung einschränken könnte, und schlägt potenzielle Änderungen vor, die hilfreich sein könnten.

Verwenden des Abfrageratgebers

Sie können die Abfrageratgeberfunktionen aktivieren, indem Sie die PopulateQueryAdvice Eigenschaft auf QueryRequestOptionstrue". Wenn nicht angegeben, PopulateQueryAdvice wird standardmäßig auf false. Verwenden Sie die Zeichenfolgeneigenschaft FeedResponse.QueryAdvice, um auf die Ratschläge zuzugreifen.

Von Bedeutung

Der Abfrageratgeber funktioniert nur mit dem .NET SDK für Cosmos DB. Die Abfrageberatung wird auch nur auf der ersten Roundtrip zurückgegeben. Die Beratung steht bei nachfolgenden Fortsetzungsaufrufen nicht zur Verfügung.

Betrachten Sie diese Beispielabfrage:

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

Hier ist ein Beispiel für eine SDK-Anforderung, die diese Abfrage ausführt und den Abfrageratgeber verwendet:

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

Diese Anforderung gibt eine einzelne Beratungserklärung für QA1002:

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

Die Abfrageberatung enthält drei wichtige Informationen:

  • Die Abfrageberatungs-ID: QA1002
  • Die Empfehlungsbeschreibung: IN diesem Beispiel If you are matching on a string prefix, consider using STARTSWITH.
  • Der Link zur Dokumentation: Eine URL zu detaillierten Anleitungen

Hinweis

Der Link zur Dokumentation wurde aus diesem Beispiel weggelassen.

Examples

Betrachten Sie die folgenden Beispiele für Szenarien, in denen Sie den Abfrageratgeber verwenden können.

Optimieren der Systemfunktionsnutzung

Betrachten Sie dieses Beispiel, in dem die GetCurrentTimestamp Funktion verwendet wird:

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

In diesem Beispiel gibt es zwei Ratschläge, die von Abfrageratgeber zurückgegeben werden: QA1008 und QA1009. Jeder Ratschlag wird in einer neuen Zeile in der Zeichenfolgenausgabe getrennt.

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

Mit diesem Rat können Sie die Abfrage auf die folgende Alternative umschreiben:

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