如何量化衡量BigQuery历史记录优化的效果与收益?
衡量BigQuery历史并行度调整优化的收益方法
可以通过对比同一查询在优化启用前后的关键性能指标,结合BigQuery信息架构视图的数据来量化收益,具体操作如下:
1. 定位目标查询
从INFORMATION_SCHEMA.JOBS_BY_PROJECT视图中筛选出标记parallelism_adjustment: applied的查询,提取它们的job_id、query文本和执行时间范围。同时找到这些查询在优化启用前的历史执行记录,必须保证查询逻辑完全一致,无参数或表数据变更。
2. 对比核心性能指标
针对同一查询的两次执行(优化前vs优化后),重点对比以下数值指标:
- 总执行时间:直接取
elapsed_ms字段(单位毫秒),或通过total_slot_ms / 1000 / slot_count计算,优化后该值应显著降低 - 槽位资源消耗:
total_slot_ms(总槽位毫秒数,代表计算资源消耗总量),优化后通常会减少,或在相同资源下完成更快 - 数据处理量:
total_bytes_processed和total_bytes_billed,确认优化未额外增加数据扫描量 - 任务并行度:通过
INFORMATION_SCHEMA.JOB_STAGES视图查看parallel_inputs字段,对比优化前后的任务并行数变化
3. 计算量化收益
- 时间收益:
(优化前执行时间 - 优化后执行时间) / 优化前执行时间 * 100%,得到时间缩短百分比 - 资源收益:
(优化前total_slot_ms - 优化后total_slot_ms) / 优化前total_slot_ms * 100%,得到资源节省比例 - 成本收益:结合
total_bytes_billed和BigQuery定价模型,计算优化前后的账单差异(若字节计费有变化)
4. 批量分析SQL示例
如果要批量统计多个优化后的查询收益,可以用以下SQL聚合数据:
WITH optimized_jobs AS ( SELECT job_id, query, elapsed_ms / 1000 AS elapsed_sec, total_slot_ms, total_bytes_processed, JSON_EXTRACT_SCALAR(query_plan, '$.optimizations[0].parallelism_adjustment') AS optimization_applied FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE optimization_applied = 'applied' AND start_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) ), historical_jobs AS ( SELECT query, AVG(elapsed_ms / 1000) AS avg_historical_elapsed_sec, AVG(total_slot_ms) AS avg_historical_total_slot_ms FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT WHERE start_time < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY) AND query IN (SELECT query FROM optimized_jobs) GROUP BY query ) SELECT o.query, o.elapsed_sec, h.avg_historical_elapsed_sec, ROUND((h.avg_historical_elapsed_sec - o.elapsed_sec)/h.avg_historical_elapsed_sec*100, 2) AS time_saving_pct, o.total_slot_ms, h.avg_historical_total_slot_ms, ROUND((h.avg_historical_total_slot_ms - o.total_slot_ms)/h.avg_historical_total_slot_ms*100, 2) AS resource_saving_pct FROM optimized_jobs o JOIN historical_jobs h ON o.query = h.query;
注意:需替换region-us为你的实际区域,且确保历史查询与优化后查询逻辑完全一致,排除表结构变更、数据量突变等干扰。
5. 排除干扰因素
对比时需排除以下影响:
- 查询执行时段的集群负载差异,尽量选择同一时段的历史记录
- 表数据量的变化,若为增量表,需保证两次执行扫描的数据范围一致
- 查询逻辑的修改,必须是完全相同的SQL语句
内容的提问来源于stack exchange,提问作者Balkan
相关产品推荐
相关产品推荐

