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:

Wenn Sie in einer Abfrage auf diese benannten Ausdrücke verweisen, werden folgende Schritte ausgeführt:

  1. Die Berechnung innerhalb des benannten Ausdrucks wird ausgewertet. Diese Berechnung ergibt entweder einen skalaren oder tabellarischen Wert.
  2. 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 auf true 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