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 die dcount() -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, Resource1und 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))