如何使用Standard SQL删除BigQuery表分区?无需用DELETE语句(有配额限制)
删除BigQuery表分区(避开DELETE语句的配额限制)
如果要避开DELETE FROM语句的配额限制,直接用DDL语句ALTER TABLE来删除分区是更高效、更合规的方案。毕竟DELETE属于DML操作,不仅有严格的每日配额(比如修改行数、操作次数限制),而且针对大分区逐行删除的速度慢、成本高,完全没必要这么做。
核心方法:使用ALTER TABLE DROP PARTITION/PARTITIONS
BigQuery支持通过ALTER TABLE直接移除指定分区,这是DDL操作,配额限制宽松得多,且是直接删除整个分区数据,性能和成本都更优。
1. 删除单个分区
根据你的分区类型(DATE或TIMESTAMP)选择对应的语法:
- 针对DATE类型分区:
ALTER TABLE `your-project.your-dataset.your-table` DROP PARTITION DATE('2023-10-01'); - 针对TIMESTAMP类型分区:
ALTER TABLE `your-project.your-dataset.your-table` DROP PARTITION TIMESTAMP('2023-10-01 00:00:00');
2. 删除批量分区
如果需要删除某个时间范围外的所有分区,比如删除指定日期之前/之后的所有分区:
- 删除指定日期之前的所有分区:
ALTER TABLE `your-project.your-dataset.your-table` DROP PARTITIONS BEFORE DATE('2023-09-01'); - 删除指定日期之后的所有分区:
同样,TIMESTAMP类型分区可以把ALTER TABLE `your-project.your-dataset.your-table` DROP PARTITIONS AFTER DATE('2023-10-31');DATE()换成TIMESTAMP()来指定时间戳。
注意事项
- 操作前确认你拥有该表的编辑权限(比如
bigquery.tables.update权限); - 分区删除是不可逆操作,执行前务必确认目标分区正确;
- 如果你的表是按整数列分区的,语法类似,把
DATE()/TIMESTAMP()换成对应的整数值即可,比如:ALTER TABLE `your-project.your-dataset.int-partitioned-table` DROP PARTITION 123;
这种方式完全避开了DML的配额限制,而且操作速度快,适合处理大分区的删除需求。
内容的提问来源于stack exchange,提问作者Sourav Chatterjee
相关产品推荐
相关产品推荐

