Osvědčené postupy pro dotazy dotazovací jazyk Kusto

Tady je několik osvědčených postupů, které je potřeba dodržet, aby se váš dotaz spustil rychleji.

Stručně řečeno

Akce Použití Nepoužívat Poznámky
Snížení množství dotazovaných dat Ke snížení objemu zpracovávaných dat použijte mechanismy, jako where je operátor . Níže najdete efektivní způsoby, jak snížit množství zpracovávaných dat.
Vyhněte se použití redundantních kvalifikovaných odkazů Při odkazování na místní entity použijte nekvalifikovaný název. Další informace k tomuto tématu najdete níže.
datetime Sloupce datetime Použijte datový typ . Nepoužívejte long datový typ. V dotazech nepoužívejte unixové funkce převodu času, jako unixtime_milliseconds_todatetime()je . Místo toho použijte zásady aktualizace k převodu unixového času na datový typ během příjmu datetime dat.
Řetězcové operátory Použití operátoru has Nepoužívat contains Když hledáte úplné tokeny, has funguje to lépe, protože nehledá podřetěžce.
Operátory rozlišující malá a velká písmena Použití == Nepoužívat =~ Pokud je to možné, používejte operátory s rozlišováním velkých a malých písmen.
Použití in Nepoužívat in~
Použití contains_cs Nepoužívat contains Pokud můžete použít has/has_cs a nemůžete použít contains/contains_cs, je to ještě lepší.
Hledání textu Vyhledání konkrétního sloupce Nepoužívat * * provede fulltextové vyhledávání ve všech sloupcích.
Extrahování polí z dynamických objektů přes miliony řádků Materializujte sloupec v době příjmu dat, pokud většina dotazů extrahuje pole z dynamických objektů přes miliony řádků. Tímto způsobem zaplatíte za extrakci sloupců jenom jednou.
Vyhledávání vzácných klíčů nebo hodnot v dynamických objektech Použití MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value" Nepoužívat MyTable | where DynamicColumn.SomeKey == "Rare value" Tímto způsobem vyfiltrujete většinu záznamů a provedete analýzu JSON jenom těch ostatních.
let příkaz s hodnotou, kterou používáte více než jednou Použití funkce materialize() Další informace o tom, jak používat materialize(), najdete v tématu materialize(). Další informace najdete v tématu Optimalizace dotazů, které používají pojmenované výrazy.
Použití převodů u více než 1 miliardy záznamů Přetvářením dotazu snižte množství dat předávaných do převodu. Nepřevádí velké objemy dat, pokud se tomu dá vyhnout.
Nové dotazy Na konci použijte limit [small number] nebo count . Spouštění nevázaných dotazů na neznámé datové sady může přinést výsledky v GB, které se mají vrátit do klienta, což vede k pomalé odezvě a zaneprázdněnému clusteru.
Porovnání nerozlišující malá a velká písmena Použití Col =~ "lowercasestring" Nepoužívat tolower(Col) == "lowercasestring"
Porovnání dat již malými písmeny (nebo velkými písmeny) Col == "lowercasestring" (nebo Col == "UPPERCASESTRING"). Nepoužívejte porovnávání nerozlišující malá a velká písmena.
Filtrování sloupců Filtruje sloupec tabulky. Nefiltrujte počítaný sloupec.
Použití T | where predicate(*Expression*) Nepoužívat T | extend _value = *Expression* | where predicate(_value)
Operátor summarize Pokud má operátor summarize vysokou kardinalitu, použijte hint.shufflekey=<key>group by keys. Vysoká kardinalita je ideálně vyšší než 1 milion.
Operátor join Vyberte tabulku s menším počtem řádků, která má být první (úplně vlevo v dotazu).
Pro filtrování podle jednoho sloupce použijte in místo levé join středníky.
Připojení mezi clustery Napříč clustery spusťte dotaz na pravé straně spojení, kde se nachází většina dat.
Spojení, pokud je levá strana malá a pravá velká Použijte hint.strategy=broadcast. Malé znamená až 100 MB dat.
Spojení, když je pravá strana malá a levá je velká Místo operátoru joinpoužijte operátor vyhledávání. Pokud je pravá strana vyhledávání větší než několik desítek MB, dotaz selže.
Spojení, pokud jsou obě strany příliš velké Use hint.shufflekey=<key> Použijte, když má klíč join vysokou kardinalitu.
Extrahování hodnot ve sloupci s řetězci sdílejících stejný formát nebo vzor Použití operátoru parse Nepoužívejte několik extract() příkazů. Například hodnoty jako "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ...."
extract() – funkce Použijte, když analyzované řetězce nemají stejný formát nebo vzor. Extrahujte požadované hodnoty pomocí regulárního výrazu REGEX.
materialize() – funkce Odešlete všechny možné operátory, které zmenší materializovanou datovou sadu a zachovají sémantiku dotazu. Například filtry nebo projekt jenom požadované sloupce. Další informace najdete v tématu Optimalizace dotazů, které používají pojmenované výrazy.
Použití materializovaných zobrazení K ukládání běžně používaných agregací používejte materializovaná zobrazení . Upřednostněte použití materialized_view() funkce k dotazování pouze na materializovanou část. materialized_view('MV')

Snížení objemu zpracovávaných dat

Výkon dotazu přímo závisí na množství dat, která potřebuje zpracovat. Čím méně dat se zpracuje, tím rychlejší dotaz (a tím méně prostředků spotřebuje). Proto je nejdůležitějším osvědčeným postupem strukturovat dotaz tak, aby se snížilo množství zpracovávaných dat.

Poznámka

V následující diskuzi je důležité mít na paměti koncept selektivity filtru. Selektivita je to, jaké procento záznamů se při filtrování podle určitého predikátu odfiltruje. Vysoce selektivní predikát znamená, že po použití predikátu zbývá jen několik záznamů, což snižuje množství dat, která je potřeba následně efektivně zpracovat.

V pořadí podle důležitosti:

  • Pouze referenční tabulky, jejichž data jsou potřebná dotazem. Například při použití operátoru union s odkazy na tabulky se zástupným znakem je z hlediska výkonu lepší odkazovat pouze na několik tabulek, místo použití zástupného znaku (*) k odkazování na všechny tabulky a následné filtrování dat pomocí predikátu v názvu zdrojové tabulky.

  • Pokud je dotaz relevantní jenom pro konkrétní obor, využijte výhod datového oboru tabulky. Funkce table() poskytuje efektivní způsob, jak eliminovat data tím, že je nastaví na základě zásad ukládání do mezipaměti (parametr DataScope).

  • Okamžitě použijte where operátor dotazu následující odkazy na tabulky.

  • Při použití operátoru where dotazu může mít uvážlivé použití pořadí predikátů (v jednom operátoru nebo u několika po sobě jdoucích operátorů nezáleží na tom, který) může mít významný vliv na výkon dotazu, jak je vysvětleno níže.

  • Nejprve použijte predikáty celých horizontálních oddílů. To znamená, že predikáty, které používají funkci extent_id(), by se měly použít jako první, stejně jako predikáty, které používají funkci extent_tags(), a predikáty, které jsou velmi selektivní na datové oddíly tabulky (pokud jsou definované).

  • Pak použijte predikáty, které fungují na datetime sloupce tabulky. Kusto obsahuje velmi efektivní index těchto sloupců, který často zcela eliminuje celé horizontální oddíly dat, aniž by bylo nutné k těmto horizontálním oddílům přistupovat.

  • Potom použijte predikáty, které fungují na string sloupce a dynamic , zejména takové predikáty, které platí na úrovni termínu. Predikáty by měly být seřazené podle selektivity (například vyhledávání ID uživatele, když existují miliony uživatelů, je velmi selektivní a obvykle se jedná o vyhledávání termínů, pro které je index velmi efektivní).

  • Pak použijte predikáty, které jsou selektivní a jsou založené na číselných sloupcích.

  • A konečně u dotazů, které prohledávají data sloupce tabulky (například pro predikáty typu obsahuje @!@!, které nemají žádné termíny a nemají užitek z indexování), seřadí predikáty tak, aby byly jako první ty, které prohledávají sloupce s menším objemem dat. To snižuje potřebu dekomprese a skenování velkých sloupců.

Vyhněte se použití redundantních kvalifikovaných odkazů

Na entity, jako jsou tabulky a materializovaná zobrazení, se odkazuje podle názvu. Na tabulku T lze například odkazovat jednoduše T ( nekvalifikovaný název), pomocí kvalifikátoru databáze (např. database("DB").T pokud je tabulka v databázi s názvem DB), nebo pomocí plně kvalifikovaného názvu (např. cluster("X.Y.kusto.windows.net").database("DB").T).

Osvědčeným postupem je nepoužívat kvalifikace názvů, pokud jsou nadbytečné, a to z následujících důvodů:

  1. Nekvalifikované názvy se snadněji identifikují (pro lidské čtenáře) jako názvy, které patří do databáze v oboru.

  2. Odkazování na entity databáze v oboru je vždy přinejmenším stejně rychlé a v některých případech mnohem rychlejší než entity, které patří do jiných databází (zejména pokud jsou tyto databáze v jiném clusteru). Když se vyhnete kvalifikovaným názvům, pomůžete čtenáři udělat správnou věc.

Poznámka

To neznamená, že kvalifikované názvy jsou špatné pro výkon. Kusto je ve většině případů schopné identifikovat, když plně kvalifikovaný název odkazuje na entitu patřící do databáze v oboru, a "zkratovat" dotaz, aby se nepovažoval za dotaz mezi clustery. Doporučujeme ale, abyste se na to nespoléhali, pokud to není nutné, z výše uvedených důvodů.