BigQuery分区表全量删除疑问:每日CSV导入前如何正确操作?
BigQuery 删除全表数据及_PARTITIONTIME作用解答
选哪种方法?
如果你的需求是插入新数据前删除表中所有行,直接用方法1即可,方法2仅删除当天分区的数据,不符合你清空全表的要求。
两种方法差异
方法1:
DELETE FROMproject.dataset.tableWHERE true;
该语句会删除表内所有分区的全部数据,完全匹配你“清空全表”的需求。但需注意:若表数据量较大,全表DELETE会扫描所有数据,可能产生较高费用,执行时间也更长。方法2:
target_date = datetime.today().strftime('%Y-%m-%d') #ex. 2023-07-26 DELETE FROM `project.dataset.table` WHERE DATE(_PARTITIONTIME) = '{target_date}'该语句仅删除当天分区的数据,其他日期的分区数据会保留,和你“删除所有行”的需求不匹配。
_PARTITIONTIME的作用
_PARTITIONTIME是BigQuery时间分区表的内置字段,用来标记每行数据所属的分区日期:
- BigQuery会自动把数据按日期拆分到不同分区存储,核心作用是优化查询性能、降低成本——当你查询指定日期的数据时,只需扫描对应分区,无需遍历全表。
- 对于按日分区的表,每行数据的
_PARTITIONTIME默认取数据写入的日期;若你指定了自定义日期字段作为分区键,_PARTITIONTIME会和该字段的日期保持一致。
额外优化建议
如果你的场景是每日全量替换数据,更推荐用TRUNCATE TABLE project.dataset.table``来清空表:
- TRUNCATE直接删除整个表的存储(分区表则删除所有分区),无需扫描全表数据,比DELETE效率更高、费用更低。
内容的提问来源于stack exchange,提问作者Lara19
相关产品推荐
相关产品推荐

