Optimieren von Abfragen, die benannte Ausdrücke verwenden
In diesem Artikel erfahren Sie, wie Sie die wiederholte Verwendung benannter Ausdrücke in einer Abfrage optimieren.
In der Kusto-Abfragesprache können Namen auf unterschiedliche Weise an komplexe Ausdrücke gebunden werden:
- In einer let-Anweisung
- Im as-Operator
- In der Liste der formalen Parameter der benutzerdefinierten Funktionen
Wenn Sie in einer Abfrage auf diese benannten Ausdrücke verweisen, werden folgende Schritte ausgeführt:
- Die Berechnung innerhalb des benannten Ausdrucks wird ausgewertet. Diese Berechnung ergibt entweder einen skalaren oder tabellarischen Wert.
- Der benannte Ausdruck wird durch den berechneten Wert ersetzt.
Wenn der gleiche gebundene Name mehrmals verwendet wird, wird die zugrunde liegende Berechnung mehrmals wiederholt. Wann ist das relevant?
- Wenn die Berechnungen viele Ressourcen beanspruchen und mehrmals verwendet werden
- Wenn die Berechnung nicht deterministisch ist, bei der Abfrage aber davon ausgegangen wird, dass bei allen Aufrufen der gleiche Wert zurückgegeben wird
Minderung
Zur Vermeidung dieser Probleme können die Berechnungsergebnisse während der Abfrage im Arbeitsspeicher materialisiert werden. Die zu verwendende Materialisierungsstrategie hängt davon ab, wie die benannte Berechnung definiert ist:
Tabellarische Funktionen
Verwenden Sie die folgenden Strategien für tabellarische Funktionen:
- let-Anweisungen und Funktionsparameter: Verwenden Sie die Materialize() -Funktion.
- as-Operator: Legen Sie den Hinweiswert
hint.materialized
auftrue
fest.
In der folgenden Abfrage wird beispielsweise der nicht deterministische sample-Operator verwendet:
Hinweis
Tabellen werden im Allgemeinen nicht sortiert. Daher sind Tabellenverweise in einer Abfrage naturgemäß nicht deterministisch.
Verhalten ohne Verwendung der Materialisierungsfunktion
range x from 1 to 100 step 1
| sample 1
| as T
| union T
Ausgabe
x |
---|
63 |
92 |
Verhalten bei Verwendung der Materialisierungsfunktion
range x from 1 to 100 step 1
| sample 1
| as hint.materialized=true T
| union T
Ausgabe
x |
---|
95 |
95 |
Skalarfunktionen
Für nicht deterministische Skalarfunktionen kann mithilfe von toscalar() erzwungen werden, dass sie genau einmal berechnet werden.
In der folgenden Abfrage wird beispielsweise die nicht deterministische Funktion rand() verwendet:
let x = () {rand(1000)};
let y = () {toscalar(rand(1000))};
print x, x, y, y
Ausgabe
print_0 | print_1 | print_2 | print_3 |
---|---|---|---|
166 | 137 | 70 | 70 |
Verwandte Inhalte
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