Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare queste query SQL di esempio con tabelle di sistema per monitorare le prestazioni, l'utilizzo e i costi di SQL Warehouse. Modificare le query in base alle esigenze dell'organizzazione. Aggiungere avvisi per ricevere una notifica di valori imprevisti.
Requisiti
- È necessario avere accesso alle tabelle di sistema. Per i requisiti, vedere Monitorare l'attività dell'account con le tabelle di sistema .
- La maggior parte delle tabelle di sistema richiede che l'account disponga dell'abilitazione di Unity Catalog.
Tabelle per il monitoraggio di SQL Warehouse
| Tabella di sistema | Descrizione |
|---|---|
system.compute.warehouse_events |
Tiene traccia degli eventi di avvio, arresto, aumento e riduzione delle prestazioni del magazzino. |
system.compute.warehouses |
Contiene snapshot delle configurazioni del warehouse. |
system.query.history |
Registra informazioni dettagliate su ogni query eseguita in SQL Warehouse. |
system.billing.usage |
Contiene i record di fatturazione per tutti gli utilizzi di Azure Databricks. |
Esempio: Utilizzo magazzino
Usare le query seguenti per comprendere come viene usato il warehouse, incluse le query, gli utenti e le applicazioni che determinano la maggior parte delle attività.
Trova le query più lente in un magazzino dati
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
Analizzare le tendenze delle prestazioni delle query nel tempo
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
Trovare gli utenti più attivi in un magazzino
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
Trovare le principali applicazioni 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.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
Monitorare le query non riuscite
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
Esempio: dimensionamento magazzino
Usare le query seguenti per determinare se il magazzino è dimensionato correttamente. Le query in attesa della capacità suggeriscono che è necessario aumentare max_clusters. Le query con un eccessivo overflow di disco indicano che è necessario aumentare le dimensioni del data warehouse.
Identificare le query in attesa della capacità
Le query con valori elevati waiting_at_capacity_duration_ms impiegano tempo in coda anziché essere eseguite. Prendere in considerazione l'aumento dell'impostazione del magazzino max_clusters per consentire la scalabilità del magazzino.
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
Identificare le query con una perdita eccessiva di disco
Lo spill del disco si verifica quando una query richiede più memoria di quanto sia disponibile. Prendere in considerazione l'aumento delle dimensioni del warehouse per fornire più memoria alle query. La perdita eccessiva indica in genere che le query necessitano di ottimizzazione o che le dimensioni del magazzino siano troppo piccole per il carico di lavoro.
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
Esempio: Costi del magazzino
Usare le query seguenti per comprendere e tenere traccia dei costi associati ai warehouse SQL.
Monitorare i costi del magazzino per giorno
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
Correlare gli eventi del data warehouse con il volume di query
Questa query consente di comprendere la relazione tra gli eventi di ridimensionamento del warehouse e l'attività di query per identificare le opportunità di ottimizzazione dei costi.
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