如何清理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数据,我考虑的优化方案有:
- 删除变更日志中不再需要的旧行
- 通过Firebase BQ扩展配置添加时间分区
- 创建任务将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
相关产品推荐
相关产品推荐

