Verwenden des Abfrage-Hash zum Identifizieren von Mustern und Trends in Abfragen¶
Um ähnliche Abfragen im Abfrageverlauf zu identifizieren, zu gruppieren und zu analysieren, können Sie einen Hash-Wert des Abfragetextes verwenden. Beispiele:
Gruppieren Sie Abfragen nach dem Abfrage-Hash, um Muster in kostenintensiven Abfragen zu erkennen.
Ermitteln Sie die Auswirkungen von Leistungsverbesserungen (z. B. Änderungen an Gruppierungsschlüsseln) auf wiederholte Abfragen.
In den folgenden Ansichten und Tabellenfunktionen können Sie die Spalten query_hash
und query_parameterized_hash
verwenden, um den Hash des Abfragetextes zu erhalten:
ACCOUNT_USAGE-Ansichten (1 Jahr Aufbewahrung)
INFORMATION_SCHEMA-Tabellenfunktionen (7 Tage Aufbewahrung)
Tabellenfunktion QUERY_HISTORY
Tabellenfunktion TASK_HISTORY
Sie können diesen Hash verwenden, um wiederholte Abfragen zu analysieren.
Verwenden des Hash-Wertes der Abfrage (query_hash
)¶
Die Spalte query_hash
enthält einen Hash-Wert, der auf der Grundlage des kanonisierten Textes der SQL-Anweisung berechnet wird. Wiederholte Abfragen, die genau den gleichen Abfragetext haben, haben auch die gleichen query_hash
-Werte.
Wiederholte Abfragen haben auch dann dieselbe query_hash
-Wert, wenn sich ihr Abfragetext nur in Folgendem unterscheidet:
Bezeichner, Sitzungsvariable und Stagingbereich ohne Berücksichtigung der Groß-/Kleinschreibung
Beachten Sie, dass dies nicht für Bezeichner gilt, die unter Verwendung von IDENTIFIER() mit Bindungsvariablen angegeben werden. Bindungsvariablen mit unterschiedlichen Werten erzeugen unterschiedliche Abfrage-Hashes.
Leerzeichen
Kommentare
Wenn ein anderer Teil des Abfragetextes zweier Abfragen unterschiedlich ist, haben diese Abfragen unterschiedliche query_hash
-Werte.
Die folgenden Abfragen haben zum Beispiel den gleichen query_hash
-Wert, weil sie genau den gleichen Abfragetext haben.
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'TIM'
Sie können den query_hash
-Wert verwenden, um Muster in der Abfrageleistung zu finden, die sonst vielleicht nicht offensichtlich sind. Auch wenn eine Abfrage bei der einmaligen Ausführung nicht übermäßig teuer ist, kann eine häufig wiederholte Abfrage zu hohen Kosten führen, je nachdem, wie oft sie ausgeführt wird. Sie können den query_hash
-Wert verwenden, um die Abfragen zu identifizieren, auf deren Optimierung Sie sich zuerst konzentrieren sollten.
Die folgende Abfrage verwendet zum Beispiel den query_hash
-Wert, um die Abfrage-IDs der 100 am längsten ausgeführten Abfragen zu identifizieren:
SELECT
query_hash,
COUNT(*),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE warehouse_name = 'MY_WAREHOUSE'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 7
GROUP BY query_hash
ORDER BY SUM(total_elapsed_time) DESC
LIMIT 100;
Verwenden des Hash-Wertes der parametrisierten Abfrage (query_parameterized_hash
)¶
Die Spalte query_parameterized_hash
enthält einen Hash-Wert, der auf der Grundlage der parametrisierten Abfrage berechnet wird, d. h. der Version der Abfrage nach der Parametrisierung der Literale. Diese Literale müssen im Abfrageprädikat und mit einem der folgenden Vergleichsoperatoren verwendet werden:
=
(gleich)!=
(ungleich)>=
(größer oder gleich)<=
(kleiner oder gleich)
Wiederholte Abfragen (auch solche mit unterschiedlichen Parameterwerten) haben denselben query_parameterized_hash
-Wert.
Wiederholte Abfragen haben auch dann dieselbe query_parameterized_hash
-Wert, wenn sich ihr Abfragetext nur in Folgendem unterscheidet:
Bezeichner, Sitzungsvariable und Stagingbereich ohne Berücksichtigung der Groß-/Kleinschreibung
Beachten Sie, dass dies nicht für Bezeichner gilt, die unter Verwendung von IDENTIFIER() mit Bindungsvariablen angegeben werden. Bindungsvariablen mit unterschiedlichen Werten erzeugen unterschiedliche Abfrage-Hashes.
Leerzeichen
Kommentare
Abfragen, die denselben query_hash
-Wert haben, haben auch denselben query_parameterized_hash
-Werte, aber nicht umgekehrt.
Die folgenden Abfragen haben zum Beispiel denselben query_parameterized_hash
-Wert, da sich die Abfragen nur durch die Literalwerte unterscheiden:
SELECT * FROM table1 WHERE table1.name = 'TIM'
SELECT * FROM table1 WHERE table1.name = 'AIHUA'
Wie bei dem query_hash
-Wert können Sie den query_parameterized_hash
-Wert verwenden, um Muster in der Abfrageleistung zu finden, die sonst vielleicht nicht offensichtlich sind.
Die folgende Anweisung berechnet den durchschnittlichen Wert für total_elapsed_time
pro Tag für alle Abfragen mit einem bestimmten query_parameterized_hash
-Wert (cbd58379a88c37ed6cc0ecfebb053b03
):
SELECT
DATE_TRUNC('day', start_time),
SUM(total_elapsed_time),
ANY_VALUE(query_id)
FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY
WHERE query_parameterized_hash = 'cbd58379a88c37ed6cc0ecfebb053b03'
AND DATE_TRUNC('day', start_time) >= CURRENT_DATE() - 30
GROUP BY DATE_TRUNC('day', start_time);
Überprüfen der zum Generieren des Hash-Wertes verwendeten Version¶
Im Laufe der Zeit kann sich die Logik ändern, die Snowflake zum Generierung des Abfrage-Hashes verwendet. Änderungen an dieser Logik können dazu führen, dass für dieselbe Abfrage unterschiedliche Hashes erzeugt werden. Für eine bestimmte Abfrage kann sich zum Beispiel der mit Version 1 der Logik erzeugte Hash von dem mit Version 2 der Logik erzeugten Hash unterscheiden.
Die Ansichten und die Ausgabe der Tabellenfunktionen, die die Spalten query_hash
und query_parameterized_hash
enthalten, enthalten auch die folgenden Spalten mit der Version der Logik, die zum Erstellen des Hash-Wertes verwendet werden:
query_hash_version
query_parameterized_hash_version
Die Versionsnummer in diesen Spalten ist ein NUMBER-Wert (z. B. 1
für die erste Version der Logik, 2
für die zweite Version der Logik usw.).
Wenn diese Spalten unterschiedliche Versionsnummern für verschiedene Zeiträume enthalten, können Sie diese Versionsspalten verwenden, um die verschiedenen Hashes für dieselbe Abfrage zu identifizieren. Beispiel:
...
WHERE (query_hash = 'hash_from_v1' AND query_hash_version = 1)
OR (query_hash = 'hash_from_v2' AND query_hash_version = 2)