materialize()
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Zachytí hodnotu tabulkového výrazu po dobu trvání provádění dotazu, aby se dotaz mohl odkazovat vícekrát bez přepočtu.
Syntaxe
materialize(
výraz)
Přečtěte si další informace o konvencích syntaxe.
Parametry
Název | Type | Požadováno | Popis |
---|---|---|---|
výraz | 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:
- Chcete-li urychlit dotazy, které provádějí náročné výpočty, jejichž výsledky se v dotazu používají vícekrát.
- Chcete-li vyhodnotit tabulkový výraz pouze jednou a použít ho mnohokrát v dotazu. To se obvykle vyžaduje, pokud je tabulkový výraz ne deterministický. Například pokud výraz používá
rand()
nebodcount()
funkce.
Poznámka:
Materialize má limit velikosti mezipaměti 5 GB. Toto omezení platí pro každý uzel clusteru a je vzájemné pro všechny dotazy spuštěné současně. 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í hint.materialized
příznaku operátoru 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 udržují sémantiku dotazu. Například použijte běžné filtry nad stejným materializovaným výrazem.
- Použití materializace s spojením nebo sjednocením, pokud jejich operandy mají vzájemné poddotazy, které lze provést jednou. Můžete například spojit/sjednocovat nohy forku. Podívejte se na příklad použití operátoru join.
- Materializace se dá použít pouze v příkazech let, pokud zadáte název výsledku uloženého v mezipaměti. Viz příklad použití příkazů let).
Příklady zlepšení výkonu dotazů
Následující příklad ukazuje, jak materialize()
lze použít ke zlepšení výkonu dotazu.
_detailed_data
Výraz je definován pomocí materialize()
funkce, a proto se počí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
State | Typ události | EventPercentage | Události |
---|---|---|---|
HAVAJ VODY | Okapová trouba | 100 | 2 |
LAKE ONTARIO | Mořské bouřmové vítr | 100 | 8 |
ZÁLIV ALJAŠKY | Okapová trouba | 100 | 4 |
ATLANTIC NORTH | Mořské bouřmové vítr | 95.2127659574468 | 179 |
JEZERO ERIE | Mořské bouřmové vítr | 92.5925925925926 | 25 |
E PACIFIC | Okapová trouba | 90 | 9 |
JEZERO MICHIGAN | Mořské bouřmové vítr | 85.1648351648352 | 155 |
JEZERO HURON | Mořské bouřmové vítr | 79.3650793650794 | 50 |
MEXICKÝ ZÁLIV | Mořské bouřmové vítr | 71.7504332755633 | 414 |
HAVAJ | High Surf | 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
) - Nejvyšší tři hodnoty v sadě
- Součet všech těchto hodnot v sadě
Tuto operaci lze provést pomocí dávek a materializace:
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:
Počet 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ů napříč miliony řádků.
Pokud chcete použít let
příkaz s hodnotou, kterou používáte více než jednou, použijte funkci materialize(). Pokuste se nasdílet všechny možné operátory, které zmenší materializovanou datovou sadu a stále zachová sémantiku dotazu. Můžete například použít filtry nebo jenom požadované sloupce projektu.
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 je Text
vzájemný a lze ho odeslat do výrazu materializace.
Dotaz potřebuje pouze sloupce Timestamp
, Text
, Resource1
a Resource2
. Promítnou tyto sloupce uvnitř 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))
Když 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 ponechte v každé sjednocovací noze, aby se zachovala sémantika 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))