Untersuchen von Ausführungszeiten

Unter diesem Thema wird erklärt, wie Sie die Performance von ausgeführten Abfragen und Aufgaben näher untersuchen können. Anhand dieser Informationen können Sie Kandidaten für eine Leistungsoptimierung identifizieren und feststellen, ob Ihre Optimierungsstrategien die gewünschte Wirkung zeigen.

Sie können die historische Performance mit Snowsight oder durch das Schreiben von Abfragen auf Ansichten des ACCOUNT_USAGE-Schemas untersuchen. Ein Benutzer ohne Zugriff auf das ACCOUNT_USAGE-Schema kann ähnliche Daten mithilfe des Information Schema abfragen.

Ausführungszeiten und Auslastung anzeigen

Sie können Snowsight verwenden, um visuelle Einblicke in die Performance von Abfragen und Aufgaben sowie in die Auslastung von Warehouses zu erhalten.

Abfragen
  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie Activity » Query History aus.

  3. Verwenden Sie die Spalte Duration, um zu erfahren, wie lange die Ausführung einer Abfrage gedauert hat. Sie können die Spalte sortieren, um die Abfragen mit den längsten Laufzeiten zu finden.

  4. Wenn Sie sich auf die Abfragen eines bestimmten Benutzers konzentrieren möchten, wählen Sie im Dropdown-Menü User den entsprechenden Benutzer aus.

  5. Wenn Sie sich auf die Abfragen konzentrieren möchten, die auf einem bestimmten Warehouse ausgeführt wurden, wählen Sie Filters » Warehouse und dann das Warehouse aus.

Warehouses
  1. Melden Sie sich bei Snowsight an.

  2. Wechseln Sie zu einer Rolle, die über Berechtigungen für das Warehouse verfügt.

  3. Wählen Sie Admin » Warehouses aus.

  4. Wählen Sie ein Warehouse aus.

  5. Verwenden Sie das Diagramm Warehouse Activity, um die Auslastung des Warehouses zu visualisieren, einschließlich der Anzeige, ob sich Abfragen in die Warteschlange befinden.

Aufgaben
  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie Activity » Task History aus, um für eine Aufgabe die Ausführungszeit des SQL-Codes anzuzeigen.

Aufschlüsselung der Ausführungszeiten

Im Query Profile können Sie untersuchen, welche Teile einer Abfrage am längsten zur Ausführung benötigten. Es enthält einen Bereich Most Expensive Nodes, der die Operatorknoten identifiziert, die am längsten für die Ausführung benötigten. Sie können die Daten noch weiter aufschlüsseln, indem Sie sich ansehen, wie viel Prozent der Ausführungszeit eines Knotens für eine bestimmte Kategorie der Abfrageverarbeitung aufgewendet wurde.

So greifen Sie auf das Query Profile einer Abfrage zu:

  1. Melden Sie sich bei Snowsight an.

  2. Wählen Sie Activity » Query History aus.

  3. Wählen Sie die Abfrage-ID der Abfrage aus.

  4. Wählen Sie die Registerkarte Query Profile aus.

Tipp

Sie können programmgesteuert auf die Performancestatistiken des Query Profile zugreifen, indem Sie die Funktion GET_QUERY_OPERATOR_STATS ausführen.

Abfragen zur Untersuchung der Ausführungszeiten schreiben

Das Account Usage-Schema enthält Ansichten, die sich auf die Ausführungszeiten von Abfragen und Aufgaben beziehen. Es enthält auch eine Ansicht, die sich auf die Auslastung eines Warehouses bei der Ausführung von Abfragen bezieht. Sie können Abfragen für diese Ansichten schreiben, um Performancedaten zu analysieren und kundenspezifische Berichte und Dashboards zu erstellen.

Standardmäßig kann nur der Kontoadministrator (d. h. ein Benutzer mit der Rolle ACCOUNTADMIN) auf Ansichten im ACCOUNT_USAGE-Schema zugreifen. Informationen dazu, wie auch anderen Benutzern der Zugriff auf diese Ansichten ermöglicht werden kann, finden Sie unter Aktivieren der Nutzung der SNOWFLAKE-Datenbank für andere Rollen.

Benutzer, die keinen Zugriff auf das ACCOUNT_USAGE-Schema haben (z. B. ein Benutzer, der eine Abfrage ausgeführt hat, oder ein Warehouse-Administrator), können dennoch die letzten Ausführungszeiten und andere Abfrage-Metadaten mithilfe der QUERY_HISTORY-Tabellenfunktionen des Information Schema ausgeben.

Beachten Sie, dass die ACCOUNT_USAGE-Ansichten nicht sofort nach der Ausführung einer Abfrage oder Aufgabe aktualisiert werden. Wenn Sie die Ausführungszeit einer Abfrage direkt nach ihrer Ausführung überprüfen möchten, verwenden Sie Snowsight, um deren Performance anzuzeigen. Das Information Schema wird auch schneller aktualisiert als die ACCOUNT_USAGE-Ansichten.

Ansicht ACCOUNT_USAGE

Beschreibung

Latenz

QUERY_HISTORY

Wird verwendet, um den Snowflake-Abfrageverlauf innerhalb der letzten 365 Tage (1 Jahr) nach verschiedenen Dimensionen (Zeitbereich, Ausführungszeit, Sitzung, Benutzer, Warehouse usw.) abzufragen.

Bis zu 45 Minuten

WAREHOUSE_LOAD_HISTORY

Dient der Analyse des Workloads eines Warehouses innerhalb eines bestimmten Datumsbereichs.

Bis zu 3 Stunden

TASK_HISTORY

Dient dem Abrufen des Nutzungsverlaufs der Aufgabe innerhalb der letzten 365 Tage (1 Jahr).

Bis zu 45 Minuten

Beispielabfragen

Die folgenden Abfragen für das ACCOUNT_USAGE-Schema geben Aufschluss über die bisherige Performance von Abfragen, Warehouses und Aufgaben. Klicken Sie auf den Namen einer Abfrage, um das vollständige SQL-Beispiel zu erhalten.

Abfrage-Performance
Warehouse-Auslastung
Aufgaben-Performance

Abfrage-Performance

Abfrage: Top n der am längsten ausgeführten Abfragen

Diese Abfrage liefert eine Liste der n (50 im Beispiel unten) am längsten ausgeführten Abfragen des letzten Tages. Sie können die Funktion DATEADD so einstellen, dass sie sich auf einen kürzeren oder längeren Zeitraum konzentriert. Ersetzen Sie my_warehouse durch den Namen des Warehouses.

SELECT query_id,
  ROW_NUMBER() OVER(ORDER BY partitions_scanned DESC) AS query_id_int,
  query_text,
  total_elapsed_time/1000 AS query_execution_time_seconds,
  partitions_scanned,
  partitions_total,
FROM snowflake.account_usage.query_history Q
WHERE warehouse_name = 'my_warehouse' AND TO_DATE(Q.start_time) > DATEADD(day,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0 --only get queries that actually used compute
  AND error_code IS NULL
  AND partitions_scanned IS NOT NULL
ORDER BY total_elapsed_time desc
LIMIT 50;
Copy
Abfrage: Abfragen sortiert nach Ausführungszeit in den letzten m Tagen

Diese Abfrage gruppiert Abfragen eines bestimmten Warehouses nach Buckets für die Ausführungszeit im gesamten letzten Monat. Diese Trends bei der Abfrageausführungszeit können bei der Entscheidung helfen, die Größe der Warehouses zu ändern oder einige Abfragen auf ein anderes Warehouse auszulagern. Ersetzen Sie MY_WAREHOUSE durch den Namen des Warehouses.

SELECT
  CASE
    WHEN Q.total_elapsed_time <= 60000 THEN 'Less than 60 seconds'
    WHEN Q.total_elapsed_time <= 300000 THEN '60 seconds to 5 minutes'
    WHEN Q.total_elapsed_time <= 1800000 THEN '5 minutes to 30 minutes'
    ELSE 'more than 30 minutes'
  END AS BUCKETS,
  COUNT(query_id) AS number_of_queries
FROM snowflake.account_usage.query_history Q
WHERE  TO_DATE(Q.START_TIME) >  DATEADD(month,-1,TO_DATE(CURRENT_TIMESTAMP()))
  AND total_elapsed_time > 0
  AND warehouse_name = 'my_warehouse'
GROUP BY 1;
Copy
Abfrage: Abfragen mit wiederholt langen Ausführungszeiten suchen

Sie können den Abfrage-Hash (den Wert der Spalte query_hash der ACCOUNT_USAGE-Ansicht QUERY_HISTORY) verwenden, um Muster in der Abfrageleistung zu finden, die möglicherweise 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 die Abfrage ausgeführt wird.

Sie können den Abfrage-Hash verwenden, um die Abfragen zu identifizieren, auf deren Optimierung Sie sich zuerst konzentrieren sollten. Die folgende Abfrage verwendet zum Beispiel den Wert in der Spalte query_hash, um die Abfrage-IDs für die 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;
Copy
Abfrage: Durchschnittliche Verarbeitungsleistung einer Abfrage im Zeitverlauf verfolgen

Die folgende Anweisung berechnet die durchschnittliche tägliche Gesamtausführungszeit für alle Abfragen, die einen bestimmten parametrisierten Abfrage-Hash (cbd58379a88c37ed6cc0ecfebb053b03) haben.

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);
Copy

Warehouse-Auslastung

Abfrage: Gesamte Warehouse-Auslastung

Diese Abfrage bietet einen Einblick in die Gesamtlast eines Warehouses hinsichtlich ausgeführter und in der Warteschlange befindlicher Abfragen. Diese Lastwerte repräsentieren das Verhältnis der Gesamtausführungszeit (in Sekunden) aller Abfragen mit einem bestimmten Status innerhalb eines bestimmten Intervalls zur Gesamtzeit (in Sekunden) für dieses Intervall.

Beispiel: Wenn die Gesamtzeit von 4 Abfragen in einem Intervall von 5 Minuten (300 Sekunden) 276 Sekunden betrug, dann ist der Abfragelastwert 276 / 300 = 0,92.

 SELECT TO_DATE(start_time) AS date,
  warehouse_name,
  SUM(avg_running) AS sum_running,
  SUM(avg_queued_load) AS sum_queued
FROM snowflake.account_usage.warehouse_load_history
WHERE TO_DATE(start_time) >= DATEADD(month,-1,CURRENT_TIMESTAMP())
GROUP BY 1,2
HAVING SUM(avg_queued_load) >0;
Copy

Aufgaben-Performance

Abfrage: Am längsten ausgeführte Aufgaben

Diese Abfrage listet die am längsten ausgeführten Aufgaben des letzten Tages auf, wodurch Sie Hinweise auf Optimierungsmöglichkeiten für die SQL-Anweisungen erhalten, die von der Aufgabe ausgeführt werden.

SELECT DATEDIFF(seconds, query_start_time,completed_time) AS duration_seconds,*
FROM snowflake.account_usage.task_history
WHERE state = 'SUCCEEDED'
  AND query_start_time >= DATEADD (day, -1, CURRENT_TIMESTAMP())
ORDER BY duration_seconds DESC;
Copy