Freigeben über


Beispielabfragen für die Überwachung der SQL Warehouse-Aktivität

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

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
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