Freigeben über


materialize()

Gilt für: ✅Microsoft Fabric✅Azure Data ExplorerAzure MonitorMicrosoft 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 die dcount() 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, , 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 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))