Exemples de requêtes pour le monitoring de l'activité du SQL Warehouse
Utilisez ces exemples de queries SQL avec des tables système pour surveiller les performances, l'utilisation et les coûts du SQL Warehouse. Modifiez les requêtes pour qu'elles répondent aux besoins de votre organisation. Ajoutez des alertes pour être informé des valeurs inattendues.
Exigences
- Vous devez avoir accès aux tables système. Voir référence des Tables système pour connaître les exigences.
- La plupart des tables système exigent que le compte ait Unity Catalog activé.
Tables pour le monitoring du SQL Warehouse
Table système | Description |
|---|---|
Suit les événements de start, d'arrêt, de montée en charge et de réduction de charge du warehouse. | |
Contient des instantanés des configurations de warehouse. | |
Enregistre les détails de chaque requête exécutée sur les SQL Warehouse. | |
Contient les enregistrements de facturation pour toute l'utilisation de Databricks. |
Exemple : utilisation du Warehouse
Utilisez les requêtes suivantes pour comprendre comment votre warehouse est utilisé, notamment quelles queries, utilisateurs et applications génèrent le plus d'activité.
Recherchez les queries les plus lentes sur un warehouse
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
Analysez les tendances de performance des query au fil du temps
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
Trouvez les utilisateurs les plus actifs sur un warehouse
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
Recherchez les principales applications client
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.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 Agent'
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
Surveiller les requêtes ayant échoué
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
Exemple : Dimensionnement du warehouse
Utilisez les queries suivantes pour déterminer si votre warehouse est correctement dimensionné. Les queries en attente de capacité suggèrent que vous devez augmenter max_clusters. Les queries avec un spill excessif sur le disque suggèrent que vous devez augmenter la taille du warehouse.
Identifier les query en attente de capacité
Les queries avec des valeurs waiting_at_capacity_duration_ms élevées passent du temps en file d'attente au lieu de s'exécuter. Envisagez d'augmenter le paramètre max_clusters du warehouse pour permettre au warehouse de monter en charge.
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
Identifier les queries avec un spill de disque excessif
Le spill de disque se produit lorsqu'une query requiert plus de mémoire qu'il n'y en a de disponible. Envisagez d'augmenter la taille du warehouse pour donner plus de mémoire aux queries. Un spill excessif signifie généralement que les queries nécessitent une optimisation ou que la taille du warehouse est trop petite pour la charge de travail.
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
Exemple : coûts de warehouse
Utilisez les queries suivantes pour comprendre et suivre les coûts associés à vos SQL Warehouses.
Surveiller le coût du warehouse par jour
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
Corréler les événements de warehouse avec le volume de query
Cette requête vous aide à comprendre la relation entre les événements de mise à l'échelle de la warehouse et l'activité de requête afin d'identifier les opportunités d'optimisation des coûts.
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