Megosztás a következőn keresztül:


A Cosmos DB lekérdezési tanácsadója

A Cosmos DB mostantól a Query Advisort is tartalmazza, amelynek célja, hogy gyorsabb és hatékonyabb lekérdezéseket írjon a Cosmos DB lekérdezési nyelv használatával. Függetlenül attól, hogy teljesítményre, költségre vagy méretezhetőségre optimalizál, a Query Advisor végrehajtható javaslatokat nyújt, amelyekkel a lehető legtöbbet hozhatja ki adataiból az Azure-ban és a Microsoft Fabricben.

Miért fontos a lekérdezésoptimalizálás?

A Cosmos DB lekérdezési nyelve (az Azure-ban és a Fabricben) rugalmas, így a fejlesztők jSON-adatokat kérdezhetnek le ismerős SQL-szerű szintaxissal. Az alkalmazások összetettségének növekedésével a lekérdezési struktúra kisebb eltérései jelentős hatással lehetnek a teljesítményre és a kérelemegységekre (kérelemegységekre), különösen nagy méretekben.

Például két olyan lekérdezés, amely ugyanazt az eredményt adja vissza, a predikátumok írása és az indexek alkalmazása alapján jelentősen eltérhet a hatékonyságban.

A Lekérdezési tanácsadó elemzi a lekérdezéseket, és célzott javaslatokat kínál a segítségére:

  • Csökkentse a ru-költségeket a nem hatékony kifejezések vagy a szükségtelen szűrők azonosításával.
  • A lekérdezési teljesítmény javítása optimálisabb lekérdezési struktúrákkal.
  • Az egyes javaslatok mögötti "miért" megértése világos, fejlesztőbarát nyelven írt magyarázatokkal.

Hogyan működik?

Lekérdezés végrehajtásakor a Lekérdezési tanácsadó végigfut a lekérdezési terven, kiértékeli azokat a mintákat, amelyek magas ru-használatot, túlzott vizsgálatot vagy esetleg szükségtelen feldolgozást okozhatnak. Ezután olyan javaslatokat ad vissza, amelyek jelzik, hogy a lekérdezés mely része korlátozhatja a teljesítményt, és olyan lehetséges módosításokat javasol, amelyek segíthetnek.

A Query Advisor használata

A Query Advisor képességeinek engedélyezéséhez állítsa be a tulajdonságot a PopulateQueryAdviceQueryRequestOptions következőre true: . Ha nincs megadva, PopulateQueryAdvice az alapértelmezett érték a .false A tanács eléréséhez használja a sztring tulajdonságot FeedResponse.QueryAdvice.

Fontos

A Query Advisor csak a Cosmos DB-hez készült .NET SDK-val működik. A lekérdezési tanácsok szintén csak az első körúton lesznek visszaadva. A tanács nem érhető el a későbbi folytatási hívásokhoz.

Fontolja meg ezt a példa lekérdezést:

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

Íme egy példa egy SDK-kérésre, amely végrehajtja ezt a lekérdezést, és a Query Advisort használja:

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

Ez a kérés egyetlen tanácsadási utasítást ad vissza a következőhöz QA1002:

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

A lekérdezési tanács három fontos információt tartalmaz:

  • A lekérdezési tanácsadás azonosítója: QA1002
  • A tanács leírása: Ebben a példában If you are matching on a string prefix, consider using STARTSWITH.
  • A dokumentációra mutató hivatkozás: A részletes útmutató URL-címe

Megjegyzés:

A példában nem szerepel a dokumentációra mutató hivatkozás.

Példák

Tekintse meg az alábbi példákat azokra a forgatókönyvekre, ahol használhatja a Query Advisort.

A rendszerfüggvények használatának optimalizálása

Tekintse meg ezt a példát, amelyben a GetCurrentTimestamp függvényt használják:

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

Ebben a példában a Query Advisor két tanácsot ad vissza: QA1008 és QA1009. Minden egyes tanács egy új sorra van elválasztva a sztring kimenetében.

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

Ezzel a tanácssal átírhatja a lekérdezést a következő alternatívára:

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