Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Utilisez ces exemples de requêtes SQL avec des tables système pour surveiller les performances, l’utilisation et les coûts de SQL Warehouse. Modifiez les requêtes en fonction des besoins de votre organisation. Ajoutez des alertes pour recevoir une notification des valeurs inattendues.
Exigences
- Vous devez avoir accès aux tables système. Consultez Surveiller l’activité du compte avec les tables système pour les exigences.
- La plupart des tables système nécessitent que le compte ait le catalogue Unity activé.
Tables pour la surveillance de SQL Warehouse
| Table système | Description |
|---|---|
system.compute.warehouse_events |
Effectue le suivi des événements de démarrage, d’arrêt, d'augmentation de l’échelle et de réduction de l’échelle de l’entrepôt. |
system.compute.warehouses |
Contient des captures instantanées des configurations d’entrepôt. |
system.query.history |
Enregistre des détails sur chaque requête exécutée sur les entrepôts SQL. |
system.billing.usage |
Contient des enregistrements de facturation pour toute l’utilisation d’Azure Databricks. |
Exemple : Utilisation de l’entrepôt
Utilisez les requêtes suivantes pour comprendre comment votre entrepôt est utilisé, notamment les requêtes, les utilisateurs et les applications qui pilotent le plus d’activités.
Rechercher les requêtes les plus lentes sur un entrepôt
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
Analyser les tendances des performances des requêtes 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
Rechercher les utilisateurs les plus actifs sur un entrepôt
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
Rechercher les principales applications clientes
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
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 de l’entrepôt
Utilisez les requêtes suivantes pour déterminer si votre entrepôt est correctement dimensionné. Les requêtes en attente en raison de la capacité suggèrent qu'il est nécessaire d'augmenter max_clusters. Les requêtes avec débordement de disque excessif indiquent que vous devez augmenter la taille du centre de données.
Identifier les requêtes en attente au maximum de capacité
Les requêtes avec des valeurs élevées waiting_at_capacity_duration_ms passent du temps en file d’attente au lieu d’être en cours d’exécution. Envisagez d’augmenter le réglage de l’entrepôt max_clusters pour permettre à l’entrepôt d'augmenter sa capacité.
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 requêtes avec un débordement excessif de disque
Le dépassement de disque se produit lorsqu’une requête nécessite plus de mémoire que disponible. Envisagez d’augmenter la taille de l’entrepôt pour donner plus de mémoire aux requêtes. Un dépassement excessif signifie généralement que les requêtes nécessitent une optimisation ou que la taille de l’entrepôt 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 l’entrepôt
Utilisez les requêtes suivantes pour comprendre et suivre les coûts associés à vos entrepôts SQL.
Surveiller le coût de l’entrepôt 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
Mettre en corrélation les événements d’entrepôt avec le volume de requête
Cette requête vous aide à comprendre la relation entre les événements de mise à l’échelle de l’entrepôt et l’activité de requête pour 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