You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BigQuery计费字节数不一致:账单页与审计日志、INFORMATION_SCHEMA差异排查

BigQuery查询计费字节总和与账单页数据不符(少约10%)的排查思路

问题描述

我希望精确统计每个BigQuery查询的支出,但发现通过两种方式计算的查询计费字节总和,比账单页显示的BigQuery分析总额少约10%:

  1. 审计日志:创建Cloud Logs接收器,汇总日志中每个查询的totalBilledBytes
  2. INFORMATION_SCHEMA视图:查询INFORMATION_SCHEMA.JOBS_BY_PROJECT获取计费字节,使用的SQL代码如下:
DECLARE timezone STRING DEFAULT "America/Sao_Paulo";
DECLARE gb_divisor INT64 DEFAULT CAST(POWER(2, 30) AS INT64);
DECLARE tb_divisor INT64 DEFAULT CAST(POWER(2, 40) AS INT64);
DECLARE cost_per_tb_in_dollar INT64 DEFAULT 5;

WITH q AS (
  SELECT
  DATE(creation_time, timezone) creation_date,
  FORMAT_TIMESTAMP("%F %H:%I:%S", creation_time, timezone) as query_time,
  job_id,
  total_bytes_processed / gb_divisor AS bytes_processed_in_gb,
  (total_bytes_processed / tb_divisor)*cost_per_tb_in_dollar AS cost_in_dollar,
  project_id,
  user_email,
  FROM 
    `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  WHERE
    DATE(creation_time, timezone) = "2023-06-02"
    AND project_id = <<my_project>>
  ORDER BY
    bytes_processed_in_gb DESC
)

SELECT SUM(q.bytes_processed_in_gb)
FROM q

请问我的计算是否有误?或者遗漏了什么内容?


排查方向与修正方案

1. 核心字段混淆:total_bytes_processed vs total_billed_bytes

你的SQL中使用的total_bytes_processed是查询实际处理的原始字节数,但BigQuery的计费依据是total_billed_bytes——系统会按规则对处理字节数向上取整(比如按需查询最小计费单位为10GB),这是导致差异的最直接原因。

2. 未覆盖所有计费场景

  • 非查询类作业:数据加载、导出、物化视图刷新等操作也会产生计费,这些作业默认不会被QUERY类型过滤,需要在SQL中指定job_type包含这些类型。
  • 跨区域传输费用:如果查询访问了其他区域的数据集,跨区域数据传输的费用不会体现在total_billed_bytes中,但会计入账单。
  • 槽位预留计费:若使用了槽位预留模式,账单按预留槽位的固定费用结算,而非实际查询字节数,此时按查询统计的总和必然与账单不符。

3. 时间范围对齐问题

账单的统计时间基于UTC时区,你使用America/Sao_Paulo时区过滤,可能导致跨时区的作业被遗漏,建议统一改用UTC时区匹配账单时间范围。

4. 数据同步延迟或过滤规则问题

  • INFORMATION_SCHEMA的作业数据最长有24小时的同步延迟,需确保查询时数据已完全更新。
  • 审计日志接收器若设置了过滤条件,可能排除了部分作业日志,导致统计数据不全。

修正后的SQL示例

DECLARE timezone STRING DEFAULT "UTC"; -- 改用UTC对齐账单时间
DECLARE gb_divisor INT64 DEFAULT CAST(POWER(2, 30) AS INT64);
DECLARE tb_divisor INT64 DEFAULT CAST(POWER(2, 40) AS INT64);
DECLARE cost_per_tb_in_dollar INT64 DEFAULT 5;

WITH q AS (
  SELECT
    DATE(creation_time, timezone) creation_date,
    FORMAT_TIMESTAMP("%F %H:%I:%S", creation_time, timezone) as query_time,
    job_id,
    job_type,
    total_billed_bytes / gb_divisor AS bytes_billed_in_gb, -- 改用计费字节数
    (total_billed_bytes / tb_divisor)*cost_per_tb_in_dollar AS cost_in_dollar,
    project_id,
    user_email
  FROM 
    `region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
  WHERE
    DATE(creation_time, timezone) = "2023-06-02"
    AND project_id = <<my_project>>
    AND job_type IN ("QUERY", "LOAD", "EXPORT", "MATERIALIZED_VIEW_REFRESH") -- 包含所有计费作业类型
  ORDER BY
    bytes_billed_in_gb DESC
)

SELECT SUM(q.bytes_billed_in_gb) AS total_billed_gb, SUM(q.cost_in_dollar) AS total_cost
FROM q

内容的提问来源于stack exchange,提问作者andrecsq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:40:09