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

如何清理Firestore to BigQuery扩展的变更日志旧数据?

问题背景

我使用Firebase扩展「Stream Firestore to BigQuery」将数据导出至BigQuery,该工具已稳定运行数年,但目前表体积持续增大,导致查询成本上升。由该扩展及npx @firebaseextensions/fs-bq-schema-views生成的表如下:

  • mytable_raw_changelog(1,327,594行)
  • mytable_raw_latest(55,329行)
  • mytable_schema_changelog(1,332,454行)
  • mytable_schema_latest(55,745行,单次查询需处理3.2GB数据)

单次查询mytable_schema_latest表需处理3.2GB数据,我考虑的优化方案有:

  1. 删除变更日志中不再需要的旧行
  2. 通过Firebase BQ扩展配置添加时间分区
  3. 创建任务将mytable_schema_latest复制到无历史变更的表用于查询

目前我倾向于方案1(删除旧行),因其操作最简单,现寻求该操作的推荐方法或指南。我仅需删除特定日期前、且对应文档已更新的历史变更记录,同时考虑在删除前将这些数据复制到历史表以备后续使用。

2024-03-28 更新

我注意到该扩展最新版本新增了一个参数,虽相关信息有限,但或许能解决问题:

排除旧数据负载:启用后,表行将不再包含旧数据(更新前的文档快照),可提升性能并避免潜在资源限制。

2024-05-02 更新

我采用了Greg的建议,效果良好。但因document_id可能重复,我改用唯一的完整文档路径document_name:

DELETE FROM your_dataset.your_table_changelog
  WHERE STRUCT(document_name, timestamp) NOT IN (
      SELECT AS STRUCT document_name, MAX(timestamp) AS timestamp
      FROM your_dataset.your_table_changelog
      GROUP BY document_name
  )

2024-05-06 更新

我需在语句末尾添加条件,否则会报错:UPDATE or DELETE statement over table ... would affect rows in the streaming buffer, which is not supported
修改后的语句:

DELETE FROM your_dataset.your_table_changelog
      WHERE STRUCT(document_name, timestamp) NOT IN (
          SELECT AS STRUCT document_name, MAX(timestamp) AS timestamp
          FROM your_dataset.your_table_changelog
          GROUP BY document_name
      )
  AND timestamp < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 45 MINUTE)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:47:12