materialize()

Przechwytuje wartość wyrażenia tabelarycznego na czas wykonywania zapytania, aby można było do niego odwoływać się wiele razy przez zapytanie bez ponownego obliczenia.

Składnia

materialize(Wyrażenie)

Dowiedz się więcej o konwencjach składniowych.

Parametry

Nazwa Typ Wymagane Opis
expression string ✔️ Wyrażenie tabelaryczne, które ma być oceniane i buforowane podczas wykonywania zapytania.

Uwagi

Funkcja jest przydatna materialize() w następujących scenariuszach:

  • Aby przyspieszyć wykonywanie zapytań wykonujących duże obliczenia, których wyniki są używane wiele razy w zapytaniu.
  • Aby ocenić wyrażenie tabelaryczne tylko raz i użyć go wiele razy w zapytaniu. Jest to często wymagane, jeśli wyrażenie tabelaryczne nie jest deterministyczne. Jeśli na przykład wyrażenie używa rand() funkcji lub dcount() .

Uwaga

Materializowanie ma limit rozmiaru pamięci podręcznej 5 GB. Ten limit jest na węzeł klastra i jest wzajemne dla wszystkich zapytań uruchomionych współbieżnie. Jeśli zapytanie używa materialize() , a pamięć podręczna nie może przechowywać więcej danych, zapytanie zostanie przerwane z powodu błędu.

Porada

Innym sposobem wykonania materializacji wyrażenia tabelarycznego jest użycie hint.materialized flagi operatora as i operatora partycji. Wszystkie współużytkują pojedynczą pamięć podręczną materializacji.

Porada

  • Wypchnij wszystkie możliwe operatory, które zmniejszają zmaterializowany zestaw danych i zachowują semantyka zapytania. Na przykład użyj typowych filtrów na podstawie tego samego zmaterializowanego wyrażenia.
  • Używaj zmaterializowania sprzężenia lub unii, gdy ich operandy mają wzajemne podquery, które można wykonać raz. Na przykład sprzężenia/unii nogi rozwidlenia. Zobacz przykład użycia operatora sprzężenia.
  • Materializowanie może być używane tylko w instrukcjach let, jeśli nadasz buforowanym wynikowi nazwę. Zobacz przykład użycia instrukcji let).

Przykłady poprawy wydajności zapytań

W poniższym przykładzie pokazano, jak materialize() można użyć go do zwiększenia wydajności zapytania. Wyrażenie _detailed_data jest definiowane przy użyciu materialize() funkcji i dlatego jest obliczane tylko raz.

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

Dane wyjściowe

Stan Typ zdarzenia EventPercentage Zdarzenia
HAWAJE WODY Waterspout 100 2
JEZIORO ONTARIO Burza morska wiatr 100 8
ZATOKA ALASKI Waterspout 100 4
PÓŁNOC ATLANTYCKIA Burza morska wiatr 95.2127659574468 179
LAKE ERIE Burza morska wiatr 92.5925925925926 25
E PACIFIC Waterspout 90 9
JEZIORO MICHIGAN Burza morska wiatr 85.1648351648352 155
JEZIORO HURON Burza morska wiatr 79.3650793650794 50
ZATOKA MEKSYKAŃSKA Burza morska wiatr 71.7504332755633 414
HAWAJE Wysoki surf 70.0218818380744 320

Poniższy przykład generuje zestaw liczb losowych i oblicza:

  • Ile odrębnych wartości w zestawie (Dcount)
  • Trzy pierwsze wartości w zestawie
  • Suma wszystkich tych wartości w zestawie

Tę operację można wykonać przy użyciu partii i zmaterializować:

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)

Zestaw wyników 1:

Dcount
2578351

Zestaw wyników 2:

wartość
9999998
9999998
9999997

Zestaw wyników 3:

Sum
15002960543563

Przykłady użycia materialize()

Porada

Zmaterializuj kolumnę w czasie pozyskiwania, jeśli większość zapytań wyodrębnia pola z obiektów dynamicznych w milionach wierszy.

Aby użyć instrukcji let z wartością używaną więcej niż raz, użyj funkcji materialize(). Spróbuj wypchnąć wszystkie możliwe operatory, które zredukują zmaterializowany zestaw danych i nadal zachowają semantykę zapytania. Na przykład użyj filtrów lub tylko wymaganych kolumn 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 jest Text wzajemny i można go wypchnąć do zmaterializowania wyrażenia. Zapytanie wymaga tylko kolumn Timestamp, Text, Resource1i Resource2. Projektuj te kolumny wewnątrz zmaterializowanego wyrażenia.

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

Jeśli filtry nie są identyczne, jak w poniższym zapytaniu:

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

Gdy połączony filtr znacząco zmniejsza zmaterializowany wynik, połącz oba filtry w zmaterializowanym wyniku przez wyrażenie logiczne or , jak w poniższym zapytaniu. Należy jednak zachować filtry w każdej nodze unii, aby zachować semantykę zapytania.

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