materialize()
Dotyczy: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 lubdcount()
.
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
, , Text
Resource1
, 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))