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.
Přepněte služby pomocí rozevíracího seznamu Verze . Přečtěte si další informace o navigaci.
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 | Typ | 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 nedeterministický. 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.
Návod
- Dalším způsobem, jak provést materializaci tabulkového výrazu, je použití
hint.materializedpříznaku operátoru a operátoru oddílu. Všechny sdílejí jednu mezipaměť materializace. - 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).
Upozornění
Proveďte srovnávací testy dotazů pomocí materialize(), abyste zjistili, jestli se zlepší výkon dat a vzorů dotazů. V některých případech může materialize() zvýšit využití paměti, aniž by poskytoval významné zvýšení výkonu, takže testování vám pomůže zvolit nejlepší přístup.
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
| Stát | 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:
| Suma |
|---|
| 15002960543563 |
Příklady použití materialize()
Návod
Materializujte sloupec v době příjmu dat, pokud většina dotazů extrahuje pole z dynamických objektů napříč miliony řádků. V tomto scénáři použijte přehled zásad aktualizace.
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, Resource1a 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))