materialize()
Zachytí hodnotu tabulkového výrazu po dobu trvání provádění dotazu, aby na ni dotaz mohl odkazovat vícekrát bez přepočítání.
Syntax
materialize(
Výraz)
Přečtěte si další informace o konvencích syntaxe.
Parametry
Název | Typ | Vyžadováno | Popis |
---|---|---|---|
expression | string |
✔️ | Tabulkový výraz, který se má vyhodnotit a uložit do mezipaměti během provádění dotazu. |
Poznámky
Funkce materialize()
je užitečná v následujících scénářích:
- Urychlíte dotazy, které provádějí náročné výpočty, jejichž výsledky se v dotazu používají několikrát.
- Chcete-li vyhodnotit tabulkový výraz pouze jednou a použít ho v dotazu mnohokrát. To se obvykle vyžaduje, pokud je tabulkový výraz ne deterministický. Například pokud výraz používá
rand()
funkce nebodcount()
.
Poznámka
Materialize má limit velikosti mezipaměti 5 GB. Tento limit platí pro jeden uzel clusteru a je oboustranný pro všechny souběžně spuštěné dotazy. Pokud dotaz používá materialize()
a mezipaměť nemůže uchovávat žádná další data, dotaz se přeruší s chybou.
Tip
Dalším způsobem, jak provést materializaci tabulkového výrazu, je použití příznaku hint.materialized
operátoru as a operátoru oddílu. Všechny sdílejí jednu mezipaměť materializace.
Tip
- Nasdílejte všechny možné operátory, které snižují materializovanou datovou sadu a zachovávají sémantiku dotazu. Můžete například použít běžné filtry nad stejným materializovaným výrazem.
- Použití materializace se spojením nebo sjednocením, pokud mají jejich operandy vzájemné poddotazy, které lze spustit jednou. Například spojit nebo sjednocovat nohy forku. Podívejte se na příklad použití operátoru join.
- Materialize lze v příkazech let použít pouze v případě, že výsledek uložený v mezipaměti pojmenujete. Podívejte se na příklad použití příkazů let).
Příklady vylepšení výkonu dotazů
Následující příklad ukazuje, jak materialize()
lze použít ke zlepšení výkonu dotazu.
Výraz _detailed_data
je definován pomocí materialize()
funkce, a proto se vypočítá pouze jednou.
let _detailed_data = materialize(StormEvents | summarize Events=count() by State, EventType);
_detailed_data
| summarize TotalStateEvents=sum(Events) by State
| join (_detailed_data) on State
| extend EventPercentage = Events*100.0 / TotalStateEvents
| project State, EventType, EventPercentage, Events
| top 10 by EventPercentage
Výstup
Stav | Typ události | EventPercentage | Událost |
---|---|---|---|
HAVAJSKÉ VODY | Kapka vody | 100 | 2 |
JEZERO ONTARIO | Vítr v mořské bouřce | 100 | 8 |
ALJAŠSKÝ ZÁLIV | Kapka vody | 100 | 4 |
SEVERNÍ ATLANTIK | Vítr v mořské bouřce | 95.2127659574468 | 179 |
JEZERO ERIE | Vítr v mořské bouřce | 92.5925925925926 | 25 |
E PACIFIC | Kapka vody | 90 | 9 |
MICHIGANSKÉ JEZERO | Vítr v mořské bouřce | 85.1648351648352 | 155 |
HURONSKÉ JEZERO | Vítr v mořské bouřce | 79.3650793650794 | 50 |
MEXICKÝ ZÁLIV | Vítr v mořské bouřce | 71.7504332755633 | 414 |
HAVAJ | Vysoká příboj | 70.0218818380744 | 320 |
Následující příklad vygeneruje sadu náhodných čísel a vypočítá:
- Kolik jedinečných hodnot v sadě (
Dcount
) - První tři hodnoty v sadě
- Součet všech těchto hodnot v množině
Tuto operaci lze provést pomocí dávek a materializovat:
let randomSet =
materialize(
range x from 1 to 3000000 step 1
| project value = rand(10000000));
randomSet | summarize Dcount=dcount(value);
randomSet | top 3 by value;
randomSet | summarize Sum=sum(value)
Sada výsledků 1:
Dcount |
---|
2578351 |
Sada výsledků 2:
hodnota |
---|
9999998 |
9999998 |
9999997 |
Sada výsledků 3:
Sum |
---|
15002960543563 |
Příklady použití materialize()
Tip
Materializujte sloupec v době příjmu dat, pokud většina dotazů extrahuje pole z dynamických objektů přes miliony řádků.
Pokud chcete použít let
příkaz s hodnotou, kterou používáte více než jednou, použijte funkci materialize(). Zkuste nasdílet všechny možné operátory, které zmenší materializovanou datovou sadu a stále zachovají sémantiku dotazu. Použijte například filtry nebo promítejte jenom požadované sloupce.
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text !has "somestring"
| summarize dcount(Resource1)), (materializedData
| where Text !has "somestring"
| summarize dcount(Resource2))
Filtr pro Text
je vzájemný a lze ho odeslat do výrazu materialize.
Dotaz potřebuje pouze sloupce Timestamp
, Text
, Resource1
a Resource2
. Promítejte tyto sloupce do materializovaného výrazu.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text !has "somestring"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| summarize dcount(Resource1)), (materializedData
| summarize dcount(Resource2))
Pokud filtry nejsou identické, jako v následujícím dotazu:
let materializedData = materialize(Table
| where Timestamp > ago(1d));
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))
Pokud kombinovaný filtr výrazně sníží materializovaný výsledek, zkombinujte oba filtry materializovaného výsledku logickým or
výrazem jako v následujícím dotazu. Filtry však ponechejte v každé sjednocovací noze, abyste zachovali sémantiku dotazu.
let materializedData = materialize(Table
| where Timestamp > ago(1d)
| where Text has "String1" or Text has "String2"
| project Timestamp, Resource1, Resource2, Text);
union (materializedData
| where Text has "String1"
| summarize dcount(Resource1)), (materializedData
| where Text has "String2"
| summarize dcount(Resource2))
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro