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

BigQuery分区表查询成本远超表大小,求原因及解决方法

BigQuery分区表查询异常:读取已截断数据、分区裁剪失效问题

我有一张由CloudSQL通过Datastream填充的BigQuery表。3天前为降低查询成本,我将其改为按日分区,但分区裁剪(partition pruning)未生效。由于切换回非分区表比较麻烦,就保留了分区设置。

该表每日会被截断后重新填充,当前表内有180万行数据,大小约700MB,加上20MB的流缓冲区(查询__TABLES__元表和GUI显示的数值一致)。

但执行SELECT * FROM table_name时,查询成本高达3GB,执行详情显示读取了近700万行数据,疑似已被截断的数据仍被BigQuery读取——这个大小刚好对应4天的数据量。未分区时从未出现过这个问题,请问这是什么原因?

补充信息

  • 逻辑字节:~700MB
  • 物理字节:~700MB
  • 时间旅行(Time Travel)字节:~650MB
  • 分区数:560

简化表结构如下:

event_date            DATE
hour                  INTEGER
data_columns          VARIOUS
...
datastream_metadata   RECORD
    uuid              STRING
    source_timestamp  INTEGER

无其他时间戳字段,event_date跨度数月,不适合作为过滤条件;source_timestamp仅为CloudSQL的最后修改日期,可能对应多天前的数据,也无法用于过滤。

更新1

奇怪的是,使用BigQuery的时间旅行(Time Travel)功能查询无流缓冲区的表版本时,查询成本回到700MB,但分区裁剪仍未生效。例如:

以下查询成本为3GB:

SELECT * FROM table_name
    WHERE event_date = '2023-10-29';

而以下查询(时间区间早于流缓冲区中最早记录)成本为700MB:

SELECT * FROM table_name
    FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR)
    WHERE event_date = '2023-10-29';

两者均返回约2000行数据,按event_date分区的话,查询成本应该仅为几百KB。

行为不一致:首次执行时间旅行查询时实际成本为700MB,但第二次及后续执行则按3GB计费。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:57:22