materialize()
Gilt für: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Erfasst den Wert eines tabellarischen Ausdrucks für die Dauer der Abfrageausführung, sodass sie mehrmals von der Abfrage ohne Neuberechnung referenziert werden kann.
Syntax
materialize(
expression)
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Type | 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 durchführen, deren Ergebnisse mehrmals in der Abfrage verwendet werden.
- Wenn Sie einen tabellarischen Ausdruck nur einmal auswerten und in einer Abfrage mehrmals verwenden möchten. Dies ist häufig erforderlich, wenn der tabellarische Ausdruck nicht deterministisch ist. Beispiel: Wenn der Ausdruck die
rand()
Funktionen oder diedcount()
Funktionen verwendet.
Hinweis
Materialize hat eine Cachegrößenbeschränkung von 5 GB. Dieser Grenzwert gilt pro Clusterknoten und ist für alle gleichzeitig ausgeführten Abfragen gegenseitig. Wenn eine Abfrage verwendet materialize()
wird und der Cache keine weiteren Daten enthalten kann, wird die Abfrage mit einem Fehler abgebrochen.
Tipp
Eine weitere Möglichkeit zur Materialisierung des tabellarischen Ausdrucks ist die hint.materialized
Verwendung der Kennzeichnung als Operator und Partitionsoperator. Sie alle teilen einen einzelnen Materialisierungscache.
Tipp
- Pushen Sie alle möglichen Operatoren, die das materialisierte Dataset reduzieren und die Semantik der Abfrage beibehalten. Verwenden Sie z. B. allgemeine Filter über demselben materialisierten Ausdruck.
- Verwenden Sie Materialisieren mit Verknüpfungen oder Vereinigungen, wenn ihre Operanden über gegenseitige Unterabfragen verfügen, die einmal ausgeführt werden können. Beispiel: Verknüpfungs-/Vereinigungsschenkel. Siehe Beispiel für die Verwendung des Verknüpfungsoperators.
- Materialize kann nur in Let-Anweisungen verwendet werden, wenn Sie dem zwischengespeicherten Ergebnis einen Namen zuweisen. Siehe Beispiel für die Verwendung von Let-Anweisungen).
Beispiele für Verbesserung der Abfrageleistung
Das folgende Beispiel zeigt, wie materialize()
sie verwendet werden können, um die Leistung der Abfrage zu verbessern.
Der Ausdruck _detailed_data
wird mithilfe der materialize()
Funktion definiert und wird 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 WATERS | Waterspout | 100 | 2 |
LAKE ONTARIO | Marine Thunderstorm Wind | 100 | 8 |
GOLF VON ALASKA | Waterspout | 100 | 4 |
ATLANTIC NORTH | Marine Thunderstorm Wind | 95.2127659574468 | 179 |
ERIESEE | Marine Thunderstorm Wind | 92.5925925925926 | 25 |
E PACIFIC | Waterspout | 90 | 9 |
LAKE MICHIGAN | Marine Thunderstorm Wind | 85.1648351648352 | 155 |
LAKE HURON | Marine Thunderstorm Wind | 79.3650793650794 | 50 |
GOLF VON MEXIKO | Marine Thunderstorm Wind | 71.7504332755633 | 414 |
HAWAII | High Surf | 70.0218818380744 | 320 |
Im folgenden Beispiel wird eine Reihe von Zufallszahlen generiert und berechnet:
- Anzahl unterschiedlicher Werte im Satz (
Dcount
) - Die drei wichtigsten Werte im Satz
- Die Summe aller diese Werte im Satz
Dieser Vorgang kann mithilfe von Batches und Materialisierung erfolgen:
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 mehrmals verwenden, verwenden Sie die Materialize()-Funktion. Versuchen Sie, alle möglichen Operatoren zu verschieben, die das materialisierte Dataset reduzieren und dennoch die Semantik der Abfrage beibehalten. Verwenden Sie z. B. Filter, oder projektieren 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 Text
ist gegenseitig und kann an den Materialisierungsausdruck verschoben werden.
Die Abfrage benötigt nur 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 auf 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))