DBT for BigQuery为何不支持按主键执行删除+插入增量策略?
DBT针对Snowflake支持按主键匹配的「删除现有记录再插入」增量策略,却仅为BigQuery提供分区级insert+overwrite方案,核心原因在于两款数仓的底层架构、原生能力和成本模型差异:
Snowflake的微分区与高效点更新能力
Snowflake采用微分区(Micro-Partitions)存储架构,所有数据被自动分割成小批量的微分区,且元数据集中管理、可快速检索。针对主键匹配的删除操作,Snowflake引擎能直接定位到包含目标主键的微分区,仅对相关微分区执行删除,再插入新数据,整体性能损耗极低、成本可控。DBT的delete+insert策略正是直接封装了Snowflake这一原生高效能力。BigQuery的列存储与分区优先设计
BigQuery基于列存储架构,数据按分区(如时间分区)组织,且查询计费模式以扫描数据量为核心。如果执行跨分区的主键匹配删除,引擎需要扫描大量甚至全表数据来定位目标记录,这会带来极高的成本和性能开销。官方更推荐分区级覆盖写入:直接overwrite整个分区的批量操作,能利用列存储的批量写入优势,在性能和成本上更具可行性,因此DBT默认适配了这种更贴合BigQuery特性的方案。DBT策略的原生能力适配原则
DBT的增量策略并非通用实现,而是基于各数仓的原生最优操作封装。BigQuery原生不推荐跨分区的单条/小批量主键删除操作,此类场景下的性能和成本表现远不如分区级操作,因此DBT未将通用主键删插作为默认策略提供。若需在BigQuery实现类似逻辑,可通过自定义MERGE语句(结合集群键优化)实现,但需注意评估性能与成本。
内容的提问来源于stack exchange,提问作者Dina Kleper

