Sdílet prostřednictvím


materialize()

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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() nebo dcount() 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, 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))