materialize()
Erfasst den Wert eines tabellarischen Ausdrucks für die Dauer der Abfrageausführung, sodass die Abfrage ohne Neuberechnung mehrmals darauf verweisen kann.
Syntax
materialize(
expression)
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Typ | Erforderlich | BESCHREIBUNG |
---|---|---|---|
expression | string |
✔️ | Der tabellarische Ausdruck, der während der Abfrageausführung ausgewertet und zwischengespeichert werden soll. |
Hinweise
Die materialize()
Funktion ist in den folgenden Szenarien nützlich:
- Um Abfragen zu beschleunigen, die schwere Berechnungen ausführen, deren Ergebnisse mehrmals in der Abfrage verwendet werden.
- So werten Sie einen tabellarischen Ausdruck nur einmal aus und verwenden ihn mehrmals in einer Abfrage. Dies ist häufig erforderlich, wenn der tabellarische Ausdruck nicht deterministisch ist. Beispielsweise, wenn der Ausdruck die
rand()
-Funktion oder diedcount()
-Funktion verwendet.
Hinweis
Materialize hat eine Cachegröße von 5 GB. Dieser Grenzwert gilt pro Clusterknoten und ist für alle gleichzeitig ausgeführten Abfragen gegenseitig. Wenn eine Abfrage verwendet materialize()
und der Cache keine weiteren Daten enthalten kann, wird die Abfrage mit einem Fehler abgebrochen.
Tipp
Eine weitere Möglichkeit, die Materialisierung des tabellarischen Ausdrucks durchzuführen, ist die Verwendung des hint.materialized
Flags des as-Operators und des Partitionsoperators. Sie alle teilen sich einen einzelnen Materialisierungscache.
Tipp
- Pushen Sie alle möglichen Operatoren, die das materialisierte Dataset reduzieren und die Semantik der Abfrage beibehalten. Verwenden Sie beispielsweise allgemeine Filter auf demselben materialisierten Ausdruck.
- Verwenden Sie Materialize mit Join oder Union, wenn ihre Operanden über gegenseitige Unterabfragen verfügen, die einmal ausgeführt werden können. Beispiel: join/union fork legs. Sehen Sie sich ein Beispiel für die Verwendung des Joinoperators an.
- Materialize kann nur in let-Anweisungen verwendet werden, wenn Sie dem zwischengespeicherten Ergebnis einen Namen geben. Siehe Beispiel für die Verwendung von let-Anweisungen).
Beispiele für die Verbesserung der Abfrageleistung
Das folgende Beispiel zeigt, wie materialize()
die Leistung der Abfrage verbessert werden kann.
Der Ausdruck _detailed_data
wird mithilfe der materialize()
-Funktion definiert und daher nur einmal berechnet.
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
Ausgabe
State | EventType | EventPercentage | Ereignisse |
---|---|---|---|
HAWAII-GEWÄSSER | Wasserhose | 100 | 2 |
LAKE ONTARIO | Meeresgewitterwind | 100 | 8 |
GOLF VON ALASKA | Wasserhose | 100 | 4 |
ATLANTIK, NORDEN | Meeresgewitterwind | 95.2127659574468 | 179 |
SEE ERIE | Meeresgewitterwind | 92.5925925925926 | 25 |
E PACIFIC | Wasserhose | 90 | 9 |
LAKE MICHIGAN | Meeresgewitterwind | 85.1648351648352 | 155 |
HURONSEE | Meeresgewitterwind | 79.3650793650794 | 50 |
GOLF VON MEXIKO | Meeresgewitterwind | 71.7504332755633 | 414 |
HAWAII | High Surf | 70.0218818380744 | 320 |
Im folgenden Beispiel wird eine Reihe von Zufallszahlen generiert und berechnet:
- Wie viele unterschiedliche Werte im Satz (
Dcount
) - Die drei obersten Werte im Satz
- Die Summe all dieser Werte in der Menge
Dieser Vorgang kann mithilfe von Batches und materialisiert werden:
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)
Resultset 1:
Dcount |
---|
2578351 |
Resultset 2:
value |
---|
9999998 |
9999998 |
9999997 |
Resultset 3:
Sum |
---|
15002960543563 |
Beispiele für die Verwendung von materialize()
Tipp
Materialisieren Sie die Spalte zur Erfassungszeit, wenn die meisten Ihrer Abfragen Felder aus dynamischen Objekten aus Millionen von Zeilen extrahieren.
Um die let
-Anweisung mit einem Wert zu verwenden, den Sie mehr als einmal verwenden, verwenden Sie die Materialize()-Funktion. Versuchen Sie, alle möglichen Operatoren per Push zu übertragen, die das materialisierte Dataset reduzieren und weiterhin die Semantik der Abfrage beibehalten. Verwenden Sie beispielsweise Filter, oder projizieren Sie nur erforderliche Spalten.
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))
Der Filter für Text
ist gegenseitig und kann an den Materialize-Ausdruck gepusht werden.
Die Abfrage benötigt nur die Spalten Timestamp
, Text
, Resource1
und Resource2
. Projizieren Sie diese Spalten innerhalb des materialisierten Ausdrucks.
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))
Wenn die Filter nicht identisch sind, wie in der folgenden Abfrage:
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))
Wenn der kombinierte Filter das materialisierte Ergebnis drastisch reduziert, kombinieren Sie beide Filter für das materialisierte Ergebnis durch einen logischen or
Ausdruck wie in der folgenden Abfrage. Behalten Sie jedoch die Filter in jedem Union-Teil bei, um die Semantik der Abfrage beizubehalten.
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))
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für