モニタリングSQLウェアハウスアクティビティのクエリの例
システム テーブルでこれらのSQLクエリの例を使用して、 SQLウェアハウスのパフォーマンス、使用状況、およびコストを監視します。 組織のニーズに合わせてクエリを変更します。予期しない値を通知するためのアラートを追加します。
要件
- システムテーブルにアクセスできる必要があります。 要件については、 「システム テーブルを使用したアカウント アクティビティの監視」を参照してください。
- ほとんどのシステムテーブルでは、アカウントでUnity Catalog有効にする必要があります。
SQLウェアハウスモニタリング用のテーブル
システムテーブル | 説明 |
|---|---|
ウェアハウスの開始、停止、スケールアップ、スケールダウンのイベントを追跡します。 | |
ウェアハウス構成のスナップショットが含まれます。 | |
SQLウェアハウスで実行されたすべてのクエリの詳細を記録します。 | |
すべての Databricks 使用状況の課金記録が含まれます。 |
例:ウェアハウスの使用法
次のクエリを使用して、どのクエリ、ユーザー、アプリケーションが最も多くのアクティビティを促進しているかなど、ウェアハウスがどのように使用されているかを把握します。
ウェアハウスで最も遅いクエリを見つける
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
ウェアハウスで最もアクティブなユーザーを見つける
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
上位のクライアントアプリケーションを見つける
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
失敗したクエリを監視する
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
例: ウェアハウスのサイジング
次のクエリを使用して、ウェアハウスのサイズが適切かどうかを確認します。クエリが満杯で待機中の場合、 max_clusters増やす必要があることが示唆されます。ディスク スピルが過剰なクエリの場合は、ウェアハウスのサイズを増やす必要があることが示唆されます。
容量が不足しているクエリを特定する
waiting_at_capacity_duration_ms値が高いクエリは、実行されずにキューに入れられて時間を費やしています。ウェアハウスの拡張を可能にするために、ウェアハウスmax_clusters設定を増やすことを検討してください。
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
ディスクへの過剰な書き込みがあるクエリを特定する
ディスク スピルは、クエリに必要なメモリが使用可能なメモリよりも大きい場合に発生します。クエリにさらに多くのメモリを割り当てるには、ウェアハウスのサイズを増やすことを検討してください。通常、過剰なスピルは、クエリの最適化が必要であるか、ウェアハウスのサイズがワークロードに対して小さすぎることを意味します。
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
例: 倉庫費用
SQLウェアハウスに関連するコストを理解し、追跡するには、次のクエリを使用します。
ウェアハウスのコストを日ごとに監視する
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
ウェアハウス イベントとクエリ量を相関させる
このクエリは、ウェアハウスのスケーリング イベントとクエリ アクティビティの関係を理解し、コストの最適化の機会を特定するのに役立ちます。
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