费用分析3 分钟阅读
按复杂度排名的 BigQuery 热门查询
BigQuery 中的复杂度通过槽位消耗来衡量——查询在执行期间使用的平均槽位数。此查询按估算槽位数对所有查询排名,揭示项目中计算密集度最高的操作。
为什么重要
高槽位查询影响项目中的每个人。在按需定价下,它们竞争您的公平份额槽位分配(通常为 2,000 个槽位)。在 Editions 定价下,它们直接消耗您的保留容量。识别并优化复杂查询可以改善所有用户的性能,并降低两种计费模式下的费用。
工作原理
估算槽位数通过将 total_slot_ms 除以执行时间(毫秒)来计算。使用 1,000 毫秒槽位毫秒的查询在 1 秒内平均使用约 1 个槽位。此指标捕获每个查询的并行度和计算权重。
SQL 查询
Fill in your details to get a ready-to-run query:
SQL
-- Queries ranked by average slot consumption (most compute-heavy first)
DECLARE lookback_days INT64 DEFAULT 14;
WITH jobs AS (
SELECT
user_email,
query,
project_id,
start_time,
end_time,
total_slot_ms,
COALESCE(total_bytes_billed, 0) AS bytes_billed,
TIMESTAMP_DIFF(end_time, start_time, MILLISECOND) AS duration_ms,
ROW_NUMBER() OVER (PARTITION BY job_id ORDER BY end_time DESC) AS rn
FROM `your-project`.`region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL lookback_days DAY)
AND job_type = 'QUERY' AND state = 'DONE' AND total_slot_ms IS NOT NULL
)
SELECT
user_email,
query,
project_id,
start_time,
end_time,
ROUND(SAFE_DIVIDE(total_slot_ms, duration_ms), 0) AS avg_slots,
ROUND(duration_ms / 1000, 1) AS duration_sec,
ROUND(bytes_billed / POW(1024, 4) * 6.25, 2) AS on_demand_cost_usd
FROM jobs
WHERE rn = 1
...将 your-project 和 region-us 替换为您的 GCP 项目和数据集区域。
查询说明
核心公式是 SAFE_DIVIDE(total_slot_ms, duration_ms)。如果一个查询在 100 毫秒内使用了 10,000 个槽位毫秒,其估算槽位数为 100——这意味着它同时使用了大约 100 个槽位。数字越高表示并行度越高,计算需求越大。
关键洞察
槽位 >500 的查询被认为高度复杂,可能受益于重写。
低计费字节数下的高槽位数表明计算密集型操作:复杂的 JOIN、窗口函数或大数据集上的 DISTINCT。
高字节数下的高槽位数表明数据量和计算问题——最大的优化目标。
将槽位数与执行时间进行比较:如果槽位高但执行快,查询是高效并行的,但资源密集。
最佳实践
- 1
通过预聚合或使用中间表来简化多路 JOIN。
- 2
当精度不重要时,用 APPROX_COUNT_DISTINCT() 替换精确的 COUNT(DISTINCT ...)。
- 3
避免相关子查询——将它们改写为 JOIN 或窗口函数。
- 4
在 JOIN 键上使用聚类来减少 shuffle 操作。