Udostępnij za pośrednictwem


materialize()

Dotyczy: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft Sentinel

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

Składnia

materialize(wyrażenie)

Dowiedz się więcej na temat konwencji składni.

Parametry

Nazwisko Type Wymagania opis
wyrażenie 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 dużych obliczeń, których wyniki są używane wielokrotnie 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

Materialize ma limit rozmiaru pamięci podręcznej 5 GB. Ten limit jest na węzeł klastra i jest wzajemny dla wszystkich zapytań uruchomionych jednocześ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.

Napiwek

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

Napiwek

  • Wypchnij wszystkie możliwe operatory, które zmniejszają zmaterializowany zestaw danych i przechowują semantyki zapytania. Na przykład użyj typowych filtrów na podstawie tego samego zmaterializowanego wyrażenia.
  • Użyj materializowania z sprzężenia lub unii, gdy ich operandy mają wzajemne podzapytania, które można wykonać raz. Na przykład sprzężenia/unii rozwidlenia nóg. Zobacz przykład użycia operatora sprzężenia.
  • Materialize można używać tylko w instrukcjach let, jeśli nadasz buforowanemu 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

Wyjście

Stan EventType EventPercentage Zdarzenia
HAWAJE WODY Wodopoje 100 2
JEZIORO ONTARIO Burza morska Wiatr 100 8
ZATOKA ALASKI Wodopoje 100 100
PÓŁNOC ATLANTYCKIA Burza morska Wiatr 95.2127659574468 179
LAKE ERIE Burza morska Wiatr 92.5925925925926 25
E PACIFIC Wodopoje 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 Wysoka surfowanie 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()

Napiwek

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 zmniejszy zmaterializowany zestaw danych i nadal zachowają semantyka 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, , TextResource1, i 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 na zmaterializowanym wyniku przez wyrażenie logiczne or , jak w poniższym zapytaniu. Należy jednak zachować filtry w każdej części 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))