Osvědčené postupy pro dotazy dotazovací jazyk Kusto
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Tady je několik osvědčených postupů, které je potřeba dodržovat, aby se dotaz spustil rychleji.
Zkrátka
Akce | Používání | Nepoužívat | Notes |
---|---|---|---|
Snížení množství dotazovaných dat | Pomocí mechanismů, jako where je operátor, snižte množství zpracovávaných dat. |
Další informace o efektivních způsobech snížení množství zpracovávaných dat najdete v tématu Snížení 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 naleznete v tématu Vyhněte se použití redundantních kvalifikovaných odkazů. | |
datetime sloupce |
datetime Použijte datový typ. |
Nepoužívejte long datový typ. |
Vdotazch unixtime_milliseconds_todatetime() Místo toho pomocí zásad aktualizace převeďte unixový čas na datový typ během příjmu datetime dat. |
Řetězcové operátory | Použití operátoru has . |
Nepoužívat contains |
Při hledání úplných tokenů has funguje lépe, protože nevyhledává podřetěděné řetězce. |
Operátory citlivé na malá a velká písmena | Použijte == . |
Nepoužívejte =~ . |
Pokud je to možné, používejte operátory rozlišující malá a velká písmena. |
Použijte in . |
Nepoužívejte in~ . |
||
Použijte contains_cs . |
Nepoužívejte contains . |
Použití has /has_cs je upřednostňované pro contains /contains_cs . |
|
Hledání textu | Podívejte se do konkrétního sloupce. | Nepoužívejte * . |
* provede fulltextové vyhledávání ve všech sloupcích. |
Extrakce polí z dynamických objektů napříč miliony řádků | Materializujte sloupec v době příjmu dat, pokud většina dotazů extrahuje pole z dynamických objektů napříč miliony řádků. | S touto metodou platíte pouze jednou za extrakci sloupců. | |
Vyhledávání vzácných klíčů a hodnot v dynamických objektech | Použijte MyTable | where DynamicColumn has "Rare value" | where DynamicColumn.SomeKey == "Rare value" . |
Nepoužívejte MyTable | where DynamicColumn.SomeKey == "Rare value" . |
Pomocí této metody vyfiltrujete většinu záznamů a provedete parsování json pouze ve zbývající části. |
let příkaz s hodnotou, kterou používáte více než jednou |
Použijte funkci materialize(). | Další informace o použití materialize() naleznete v tématu materialize(). Další informace naleznete v tématu Optimalizace dotazů, které používají pojmenované výrazy. |
|
Použití převodů typů u více než jedné miliardy záznamů | Reshape your query to reduce the amount of data fed into the conversion. | Pokud se tomu můžete vyhnout, nepřeveďte velké objemy dat. | |
Nové dotazy | Použijte limit [small number] nebo count na konci. |
Spouštění nevázaných dotazů u neznámých datových sad může přinést vrácení gigabajtů výsledků, což vede k pomalé odezvě a zaneprázdněnému prostředí. | |
Porovnání nerozlišující malá a velká písmena | Použijte Col =~ "lowercasestring" . |
Nepoužívejte 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í bez rozlišování malých a velkých písmen. | |
Filtrování sloupců | Filtrujte 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 vysokou kardinalitu , použijte hint.shufflekey=<key> group by keys summarize . |
Vysoká kardinalita je ideálně více než jeden milion. | |
operátor join | Vyberte tabulku s nejmenšími řádky jako první (nejvíce vlevo v dotazu). | ||
Místo levé části join použijte in pro filtrování podle jednoho sloupce. |
|||
Připojení mezi clustery | Spusťte dotaz na pravé straně spojení ve vzdálených prostředích, jako jsou clustery nebo eventhouses, kde se nachází většina dat. | ||
Spojení, pokud je levá strana malá a pravá strana je velká | Použijte hint.strategy=broadcast. | Malé odkazuje až na 100 megabajtů (MB) dat. | |
Spojení, pokud je pravá strana malá a levá strana je velká | Místo operátoru použijte vyhledávací operátor.join |
Pokud je pravá strana vyhledávání větší než několik desítek MB, dotaz selže. | |
Spojení v případech, kdy jsou obě strany příliš velké | Použijte hint.shufflekey=<key>. | Používá se, pokud má klíč spojení vysokou kardinalitu. | |
Extrahování hodnot ve sloupci s řetězci, které sdílejí stejný formát nebo vzor | Použijte operátor analýzy. | Nepoužívejte několik extract() příkazů. |
Například hodnoty jako "Time = <time>, ResourceId = <resourceId>, Duration = <duration>, ...." . |
extract() | Používá se při parsovaných řetězcích, které nemají stejný formát nebo vzor. | Extrahujte požadované hodnoty pomocí REGEX. | |
materialize() | Nasdílejte všechny možné operátory, které snižují materializovanou datovou sadu a stále udržují sémantiku dotazu. | Například filtry nebo projekt pouze požadované sloupce. Další informace naleznete 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žijte materializovaná zobrazení . Preferujte použití materialized_view() funkce pouze k dotazování materializovaných částí. |
materialized_view('MV') |
Snížení množství zpracovávaných dat
Výkon dotazu závisí přímo na množství dat, která potřebuje zpracovat. Čím méně dat se zpracovává, tím rychleji dotaz (a tím méně prostředků, které spotřebuje). Nejdůležitějším osvědčeným postupem je proto strukturovat dotaz takovým způsobem, který snižuje objem 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 vyfiltruje. Vysoce selektivní predikát znamená, že po použití predikátu zůstane pouze několik záznamů, což snižuje množství dat, která je potřeba následně efektivně zpracovat.
V pořadí důležitosti:
Odkazovat pouze na tabulky, jejichž data vyžaduje dotaz. Například při použití operátoru
union
s odkazy na tabulky se zástupným znakem je lepší z hlediska výkonu 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 u názvu zdrojové tabulky.Pokud je dotaz relevantní jenom pro konkrétní obor, využijte výhod oboru dat tabulky. Funkce table() poskytuje efektivní způsob, jak eliminovat data jejich vymezením podle zásad ukládání do mezipaměti (parametr DataScope).
where
Použijte operátor dotazu bezprostředně za odkazy na tabulku.Při použití operátoru
where
dotazu může pořadí, ve kterém umístíte predikáty, ať už používáte jedenwhere
operátor nebo několik po sobě jdoucíchwhere
operátorů, mít významný vliv na výkon dotazu.Nejprve použijte predikáty celých horizontálních oddílů. To znamená, že predikáty, které používají funkci extent_id() a funkci extent_tags(), by se měly použít jako první. Pokud máte také selektivní predikáty, které zúží data na konkrétní oddíly, měly by se použít jako první.
Potom použijte predikáty, které budou fungovat na
datetime
sloupcích tabulky. Kusto zahrnuje efektivní index těchto sloupců, často zcela eliminuje celkové horizontální oddíly dat bez nutnosti přístupu k těmto horizontálním oddílům.Pak použijte predikáty, které se chovají na
string
úrovni termínů adynamic
sloupců, zejména takové predikáty, které se vztahují na úrovni termínu. Seřadit predikáty podle selektivity. Hledání ID uživatele například v případě, že existují miliony uživatelů, je vysoce selektivní a obvykle zahrnuje hledání termínů, pro které je index velmi efektivní.Pak použijte predikáty, které jsou selektivní a jsou založeny na číselných sloupcích.
Nakonec u dotazů, které prohledávají data sloupce tabulky (například pro predikáty
contains
"@!@!"
, které nemají žádné termíny a nemají prospěch z indexování), sežádejte predikáty tak, aby ty, které prohledávají sloupce s méně daty, byly první. Tím se sníží potřeba dekomprese a skenování velkých sloupců.
Vyhněte se použití redundantních kvalifikovaných odkazů
Odkazovat na entity, jako jsou tabulky a materializovaná zobrazení podle názvu
Na tabulku T
lze například odkazovat jednoduše T
( nekvalifikovaný název) nebo pomocí kvalifikátoru databáze (například database("DB").T
pokud je tabulka v databázi s názvem DB
), nebo pomocí plně kvalifikovaného názvu (například cluster("<serviceURL>").database("DB").T
).
Na tabulku T
lze například odkazovat jednoduše T
( nekvalifikovaný název) nebo pomocí kvalifikátoru databáze (například database("DB").T
pokud je tabulka v databázi s názvem DB
), nebo pomocí plně kvalifikovaného názvu (například cluster("X.Y.kusto.windows.net").database("DB").T
).
Osvědčeným postupem je vyhnout se používání kvalifikace názvů, pokud jsou redundantní, a to z následujících důvodů:
Nekvalifikované názvy se snadněji identifikují (pro lidské čtenáře) jako patří do oboru databáze.
Odkazování na entity v oboru databáze je vždy alespoň tak rychlé a v některých případech mnohem rychlejší a pak entity, které patří do jiných databází.
To platí zejména v případě, že jsou tyto databáze v jiném clusteru.
To platí zejména v případě, že jsou tyto databáze v jiném eventhouse.
Vyhněte se kvalifikovaným názvům, aby čtenář udělal správnou věc.
Poznámka:
To neznamená, že kvalifikované názvy jsou pro výkon špatné. Kusto ve většině případů dokáže identifikovat, kdy plně kvalifikovaný název odkazuje na entitu, která patří do oboru databáze a "short-circuit" dotazu, aby nebyl považován za dotaz mezi clustery. Pokud to ale není nutné, nedoporučujeme se na to spoléhat.
Poznámka:
To neznamená, že kvalifikované názvy jsou pro výkon špatné. Kusto ve většině případů dokáže identifikovat, kdy plně kvalifikovaný název odkazuje na entitu patřící do oboru databáze. Pokud to ale není nutné, nedoporučujeme se na to spoléhat.