Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie diese Beispiel-SQL-Abfragen mit Systemtabellen , um die LEISTUNG, Nutzung und Kosten von SQL Warehouse zu überwachen. Ändern Sie die Abfragen entsprechend den Anforderungen Ihrer Organisation. Fügen Sie Benachrichtigungen hinzu, um über unerwartete Werte benachrichtigt zu werden.
Anforderungen
- Sie müssen Zugriff auf Systemtabellen haben. Siehe "Überwachen der Kontoaktivität mit Systemtabellen für Anforderungen".
- Damit die meisten Systemtabellen verwendet werden können, muss für das Konto Unity-Katalog aktiviert sein.
Tabellen für die SQL-Lagerüberwachung
| Systemtabelle | Beschreibung |
|---|---|
system.compute.warehouse_events |
Verfolgt Start-, Stopp-, Scale-up- und Scale-down-Ereignisse. |
system.compute.warehouses |
Enthält Momentaufnahmen von Lagerkonfigurationen. |
system.query.history |
Zeichnet Details zu jeder Abfrage auf, die in SQL Warehouses ausgeführt wird. |
system.billing.usage |
Enthält Abrechnungseinträge für alle Azure Databricks-Nutzungen. |
Beispiel: Lagernutzung
Verwenden Sie die folgenden Abfragen, um zu verstehen, wie Ihr Lager verwendet wird, einschließlich der Abfragen, Benutzer und Anwendungen, die die meisten Aktivitäten fördern.
Langsamste Abfragen in einem Datenlager finden
SELECT
statement_id,
executed_by,
statement_type,
execution_status,
total_duration_ms,
execution_duration_ms,
compilation_duration_ms,
waiting_at_capacity_duration_ms,
read_rows,
produced_rows,
start_time,
statement_text
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 1 DAY
ORDER BY
total_duration_ms DESC
LIMIT 50
Analysieren von Abfrageleistungstrends im Laufe der Zeit
SELECT
DATE(start_time) AS query_date,
COUNT(*) AS total_queries,
COUNT(CASE WHEN execution_status = 'FINISHED' THEN 1 END) AS successful_queries,
COUNT(CASE WHEN execution_status = 'FAILED' THEN 1 END) AS failed_queries,
ROUND(AVG(total_duration_ms), 0) AS avg_duration_ms,
ROUND(PERCENTILE(total_duration_ms, 0.5), 0) AS p50_duration_ms,
ROUND(PERCENTILE(total_duration_ms, 0.95), 0) AS p95_duration_ms,
ROUND(AVG(waiting_at_capacity_duration_ms), 0) AS avg_queue_wait_ms
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 30 DAY
GROUP BY
DATE(start_time)
ORDER BY
query_date DESC
Suchen der aktivsten Benutzer in einem Lagerhaus
SELECT
executed_by,
COUNT(*) AS query_count,
ROUND(SUM(total_duration_ms) / 1000 / 60, 2) AS total_duration_minutes,
ROUND(AVG(total_duration_ms), 0) AS avg_duration_ms
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 7 DAY
GROUP BY
executed_by
ORDER BY
query_count DESC
Suchen der wichtigsten Clientanwendungen
SELECT
client_application,
CASE
WHEN query_source.job_info.job_id IS NOT NULL THEN 'Job'
WHEN query_source.dashboard_id IS NOT NULL THEN 'Dashboard'
WHEN query_source.legacy_dashboard_id IS NOT NULL THEN 'Legacy Dashboard'
WHEN query_source.alert_id IS NOT NULL THEN 'Alert'
WHEN query_source.notebook_id IS NOT NULL THEN 'Notebook'
WHEN query_source.genie_space_id IS NOT NULL THEN 'Genie Space'
WHEN query_source.sql_query_id IS NOT NULL THEN 'SQL Editor'
ELSE 'Other'
END AS source_type,
COUNT(*) AS query_count,
ROUND(AVG(total_duration_ms), 0) AS avg_duration_ms
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 7 DAY
GROUP BY
client_application,
source_type
ORDER BY
query_count DESC
Überwachen fehlgeschlagener Abfragen
SELECT
DATE(start_time) AS failure_date,
execution_status,
error_message,
COUNT(*) AS failure_count,
COLLECT_SET(executed_by) AS affected_users
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND execution_status IN ('FAILED', 'CANCELED')
AND start_time >= NOW() - INTERVAL 7 DAY
GROUP BY
DATE(start_time),
execution_status,
error_message
ORDER BY
failure_date DESC,
failure_count DESC
Beispiel: Lagergröße
Verwenden Sie die folgenden Abfragen, um zu ermitteln, ob die Größe Ihres Lagers korrekt ist. Abfragen, die in der Warteschlange stehen, weil die Kapazität erreicht ist, weisen darauf hin, dass Sie max_clusters erhöhen müssen. Abfragen mit übermäßigem Datenträgerüberlauf deuten darauf hin, dass Sie die Lagergröße erhöhen müssen.
Identifizieren Sie Abfragen, die bei voller Auslastung warten.
Abfragen mit hohen waiting_at_capacity_duration_ms Werten verbleiben in der Warteschlange, anstatt ausgeführt zu werden. Erwägen Sie, die Lagereinstellung max_clusters zu erhöhen, damit das Lager skaliert werden kann.
SELECT
statement_id,
executed_by,
total_duration_ms,
waiting_at_capacity_duration_ms,
execution_duration_ms,
start_time,
statement_text
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 7 DAY
AND waiting_at_capacity_duration_ms > 0
ORDER BY
waiting_at_capacity_duration_ms DESC
LIMIT 50
Abfragen mit übermäßigem Festplattenüberlauf identifizieren
Datenträgerüberlauf tritt auf, wenn eine Abfrage mehr Arbeitsspeicher benötigt, als verfügbar ist. Erwägen Sie, die Lagergröße zu erhöhen, um mehr Arbeitsspeicher für Abfragen bereitzustellen. Übermäßiges Überlaufen bedeutet in der Regel, dass Abfragen eine Optimierung benötigen oder dass die Lagergröße für die Arbeitsauslastung zu klein ist.
SELECT
statement_id,
executed_by,
spilled_local_bytes / (1024 * 1024) AS spilled_mb,
read_bytes / (1024 * 1024) AS read_mb,
total_duration_ms,
start_time,
statement_text
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 7 DAY
AND spilled_local_bytes > 0
ORDER BY
spilled_local_bytes DESC
LIMIT 50
Beispiel: Lagerkosten
Verwenden Sie die folgenden Abfragen, um die Kosten für Ihre SQL-Lagerhäuser zu verstehen und nachzuverfolgen.
Überwachen der Lagerkosten nach Tag
SELECT
usage_date,
sku_name,
ROUND(SUM(usage_quantity), 2) AS total_dbus,
ROUND(SUM(usage_quantity * list_prices.pricing.default), 2) AS estimated_list_cost
FROM
system.billing.usage
LEFT JOIN system.billing.list_prices ON usage.sku_name = list_prices.sku_name
AND price_end_time IS NULL
WHERE
usage_metadata.warehouse_id = '<warehouse-id>'
AND usage_date >= NOW() - INTERVAL 30 DAY
GROUP BY
usage_date,
sku_name
ORDER BY
usage_date DESC
Korrelieren von Lagerereignissen mit Abfragevolumen
Diese Abfrage hilft Ihnen, die Beziehung zwischen Lagerskalierungsereignissen und Abfrageaktivitäten zu verstehen, um Kostenoptimierungsmöglichkeiten zu identifizieren.
WITH hourly_events AS (
SELECT
DATE_TRUNC('hour', event_time) AS event_hour,
warehouse_id,
MAX(cluster_count) AS max_clusters,
COLLECT_SET(event_type) AS event_types
FROM
system.compute.warehouse_events
WHERE
warehouse_id = '<warehouse-id>'
AND event_time >= NOW() - INTERVAL 7 DAY
GROUP BY
DATE_TRUNC('hour', event_time),
warehouse_id
),
hourly_queries AS (
SELECT
DATE_TRUNC('hour', start_time) AS query_hour,
COUNT(*) AS query_count,
ROUND(AVG(total_duration_ms), 0) AS avg_duration_ms,
ROUND(AVG(waiting_at_capacity_duration_ms), 0) AS avg_queue_wait_ms
FROM
system.query.history
WHERE
compute.warehouse_id = '<warehouse-id>'
AND start_time >= NOW() - INTERVAL 7 DAY
GROUP BY
DATE_TRUNC('hour', start_time)
)
SELECT
COALESCE(e.event_hour, q.query_hour) AS hour,
q.query_count,
q.avg_duration_ms,
q.avg_queue_wait_ms,
e.max_clusters,
e.event_types
FROM
hourly_events e
FULL OUTER JOIN hourly_queries q ON e.event_hour = q.query_hour
ORDER BY
hour DESC