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 nebo dcount() .

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.materializedoperá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, Resource1a 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))