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 lubdcount()
.
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
, 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 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))
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla