Sdílet prostřednictvím


Materializovat()

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

Návod

  • 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.
  • 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))