Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Cosmos DB teď nabízí Nástroj Query Advisor, který vám pomůže rychleji a efektivněji psát dotazy pomocí dotazovacího jazyka Cosmos DB. Bez ohledu na to, jestli optimalizujete výkon, náklady nebo škálovatelnost, poskytuje Query Advisor užitečná doporučení, která vám pomůžou co nejvíce z dat v Azure a Microsoft Fabric.
Proč záleží na optimalizaci dotazů
Dotazovací jazyk pro Cosmos DB (v Azure a Fabric) je flexibilní a umožňuje vývojářům dotazovat data JSON pomocí známé syntaxe podobné SQL. S rostoucí složitostí aplikací můžou mít malé rozdíly ve struktuře dotazů významný vliv na jednotky výkonu a požadavků (RU), zejména ve velkém měřítku.
Například dva dotazy, které vracejí stejný výsledek, se můžou výrazně lišit v závislosti na způsobu zápisu predikátů a způsobu použití indexů.
Query Advisor analyzuje vaše dotazy a nabízí cílová doporučení, která vám pomůžou:
- Snižte náklady na RU tím, že identifikujete neefektivní výrazy nebo nepotřebné filtry.
- Zlepšení výkonu dotazů prostřednictvím optimálních struktur dotazů
- Porozumíte tomu, "proč" za každým návrhem, s vysvětleními napsanými v jasném jazyce, který je vhodný pro vývojáře.
Jak to funguje
Když spustíte dotaz, Poradce pro dotazy poběží přes váš plán dotazů, vyhodnotí vzory, které můžou způsobit vysokou spotřebu RU, nadměrné kontroly nebo potenciálně zbytečné zpracování. Pak vrátí sadu doporučení, která označují, která část dotazu může omezovat výkon, a navrhne potenciální změny, které by mohly pomoct.
Použití nástroje Query Advisor
Možnosti Poradce pro dotazy můžete povolit nastavením PopulateQueryAdvice vlastnosti QueryRequestOptions na truehodnotu . Pokud není zadáno, PopulateQueryAdvice použije se falsevýchozí hodnota . Chcete-li získat přístup k doporučení, použijte vlastnost FeedResponse.QueryAdviceřetězce .
Důležité
Query Advisor funguje jenom se sadou .NET SDK pro Cosmos DB. Doporučení k dotazům se vrátí pouze při první odezvě. Doporučení není k dispozici při následných voláních pokračování.
Podívejte se na tento ukázkový dotaz:
SELECT VALUE
r.id
FROM
root r
WHERE
CONTAINS(r.name, 'Abc')
Tady je příklad požadavku sady SDK, který provádí tento dotaz a používá Poradce pro dotazy:
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);
Tato žádost vrátí jeden příkaz rady pro QA1002:
QA1002: If you are matching on a string prefix, consider using STARTSWITH. [...]
Rady k dotazům obsahují tři důležité informace:
-
ID rady pro dotazy:
QA1002 -
Popis rady: V tomto příkladu
If you are matching on a string prefix, consider using STARTSWITH. - Odkaz na dokumentaci: Adresa URL s podrobnými pokyny
Poznámka:
Odkaz na dokumentaci byl z tohoto příkladu vynechán.
Examples
Podívejte se na následující příklady scénářů, ve kterých můžete použít Poradce pro dotazy.
Optimalizace využití systémových funkcí
Podívejte se na tento příklad, GetCurrentTimestamp ve kterém se funkce používá:
SELECT
GetCurrentTicks()
FROM
container c
WHERE
GetCurrentTimestamp() > 10
V tomto příkladu jsou dvě rady vrácené poradcem pro dotazy: QA1008 a QA1009. Jednotlivé rady se v řetězcovém výstupu rozdělí na nový řádek.
QA1009: Consider using GetCurrentTimestampStatic instead of GetCurrentTimestamp in the WHERE clause. [...]
QA1008: Consider using GetCurrentTicksStatic instead of GetCurrentTicks in the WHERE clause. [...]
Pomocí této rady můžete dotaz přepsat na následující alternativu:
SELECT
GetCurrentTicksStatic()
FROM
container c
WHERE
GetCurrentTimestampStatic() > 10