如何在BigQuery中仅检索指定时间范围内的硬删除记录?
仅检索BigQuery硬删除记录的方法
针对你的问题,直接给出解决方案:
- 不管是近5分钟还是10分钟的硬删除记录,都可以通过时间旅行结合快照对比的方式获取,前提是你的表处于时间旅行保留窗口内(BigQuery默认保留7天,可按需配置更短/更长周期)。
- 时间旅行本身会返回所有变更行,但通过对比「过去某一时间点的表快照」和「当前表」,就能筛选出仅被删除的记录。
具体实现方法
方法1:用EXCEPT DISTINCT快速筛选
适合小表或对性能要求不高的场景,直接对比两个快照的全量数据:
-- 检索近5分钟内的硬删除记录 SELECT * FROM `your-project.your-dataset.your-table` FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 5 MINUTE) EXCEPT DISTINCT SELECT * FROM `your-project.your-dataset.your-table`
把SQL中的INTERVAL 5 MINUTE改成INTERVAL 10 MINUTE,就能检索近10分钟的删除记录。
方法2:用主键关联(高效版)
如果表有主键(比如id),用LEFT JOIN对比主键性能更优,适合大表场景:
-- 检索近10分钟内的硬删除记录 WITH past_snapshot AS ( SELECT id, * EXCEPT(id) FROM `your-project.your-dataset.your-table` FOR SYSTEM_TIME AS OF TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 10 MINUTE) ), current_data AS ( SELECT id, * EXCEPT(id) FROM `your-project.your-dataset.your-table` ) SELECT p.* FROM past_snapshot p LEFT JOIN current_data c ON p.id = c.id WHERE c.id IS NULL
关键说明
- 时间旅行的保留窗口决定了你能回溯的最长时间:如果你的表配置的保留期小于5/10分钟,就无法检索这段时间的删除记录。
- 上述方法仅针对硬删除(行被完全移除),软删除场景(比如用
is_deleted标记)逻辑不同,但你的场景不适用。
内容的提问来源于stack exchange,提问作者User10007
相关产品推荐
相关产品推荐

