近日,多位 Google BigQuery 用户反馈,MERGE 语句的执行速度出现异常大幅下降。尽管处理的数据量较此前明显减少,作业所消耗的槽位时间(slot time)却反而显著增加,导致查询费用飙升,部分批处理作业甚至超时失败。这一现象在 Reddit、Google Cloud 官方论坛及 Twitter 上引发广泛讨论,许多数据工程师表示“无法理解”并呼吁 Google 尽快给出解释。

问题描述:说不通的“倒挂”现象

BigQuery 的 MERGE 语句常用于数据仓库中的增量更新——根据源表与目标表的匹配情况执行 INSERT、UPDATE 或 DELETE。在常规认知中,处理的数据行数越少,所消耗的计算资源(即槽位时间)也应越低。然而,近期用户观察到完全相反的趋势:当源表或目标表的变更范围缩小后,MERGE 操作的槽位时间反而暴涨 2 到 5 倍,部分极端案例甚至达到 10 倍。

一位来自金融科技公司的数据工程师在论坛中详细描述了其遭遇:原本每天处理约 500 万行变更的 MERGE 作业,需要消耗约 120 万槽位秒;在最近一次常规数据清理后,待处理行数降至 80 万,但作业用时却从 3 分钟延长至 18 分钟,槽位时间飙升至 600 万槽位秒。“这就好比你只搬运一箱货物,却比之前搬十箱还要累。”该工程师比喻道。

技术剖析:槽位时间与数据量的背离

BigQuery 采用按需计费的弹性计算模型,用户无需自行管理集群,只需为实际使用的槽位时间付费。槽位是 BigQuery 在查询执行期间分配的计算单元(相当于 CPU+内存),槽位时间则是作业消耗这些单元的总时长。正常情况下,数据量与槽位时间呈近似线性关系,但 MERGE 作为多阶段操作,其性能受查询优化器、元数据版本、分区裁剪效率以及存储快照管理等因素影响。

Google Cloud 社区经理在回应中初步承认,近期可能对查询优化器的某些规则进行了调整,导致 MERGE 操作在特定场景下选择了不同的执行计划。例如,当目标表包含大量未合并的分区或空值列时,优化器可能错误地采用了全表扫描而非分区裁剪,从而消耗了不必要的 I/O 和计算。此外,BigQuery 的元数据服务器在近期架构升级后,可能对旧表统计信息的缓存策略产生了副作用,使得 MERGE 执行前需要重新加载元数据,增加了延迟。

影响范围:从批处理到实时管道的连锁反应

受影响的用户群体覆盖电商、广告、游戏、物联网等多个行业。由于 MERGE 是数据管道中的核心操作,其性能恶化直接导致数据延迟增加,下游报表和机器学习模型无法按时获取最新数据。部分用户不得不临时将作业切回更原始的“先删除再插入”模式,但这样既增加了开发维护成本,又可能引发数据不一致问题。

更令人担忧的是,许多企业使用 BigQuery 作为湖仓一体方案中的“黄金层”,MERGE 的降速使得实时近实时更新方案的性价比大幅下降。一位海外广告技术公司的 CTO 表示:“我们正在重新评估是否继续使用 BigQuery 作为主存储,因为 MERGE 性能的不确定性已经影响到 SLA。”

行业分析:云厂商的隐形成本转移?

有资深数据架构师指出,这类性能退化现象在大型云服务中并非首次出现。去年,AWS Redshift 和 Snowflake 也曾因查询优化器的无痕更新导致用户作业性能异常波动。云厂商在追求系统通用性和持续演进的過程中,往往无法彻底规避对局部查询的负面影响。“用户以为自己控制着代码,但实际上云端的计算引擎在不停变化。”该架构师强调。

从费用角度看,槽位时间的提升直接反映在账单上。按需计费模式下,同样的查询次数费用可能翻倍;即使是采用固定槽位容量(Flat Rate)的客户,也会因资源占用升高而影响其他并发作业,间接造成吞吐下降。

应对建议与后续展望

截至发稿,Google Cloud 尚未发布正式的事故报告或性能修复补丁。社区推荐的临时缓解方案包括:

  1. 显式指定分区过滤条件:在 MERGE 的 ON 子句中增加 _PARTITIONTIME 或自定义分区列的过滤,强制优化器进行分区裁剪。
  2. 拆分大目标表:将大型事实表按时间或业务维度拆分为多个子表,减少单次 MERGE 涉及的分区数量。
  3. 使用临时表替换:对于关键实时更新,可考虑先写入临时表,再通过 INSERT INTO SELECT 结合 WHERE NOT EXISTS 的方式替代 MERGE,注意需评估原子性问题。
  4. 回滚至旧版 SQL(如适用):部分用户发现使用查询提示 /* @QUERY_MODE=LEGACY */(已弃用但可用)可恢复部分性能,但谷歌官方不建议依赖此方法。

长期来看,Google 需要重新审视 MERGE 执行计划的稳定性,并考虑增加用户级别的“执行计划锁定”功能,避免无预警的性能退化。同时,用户也应建立更完善的性能监控告警体系,第一时间发现异常并切换到预案。

此次事件再次提醒大数据从业者:在云端,性能并非一成不变,弹性背后的“黑箱”仍可能带来意外的代价。期待 Google Cloud 团队尽快定位根因,恢复用户对 MERGE 操作的信心。