Synapse Merge更新哈希分布列突发100090报错咨询
问题根因
该报错为Azure Synapse Analytics分布式表的规则校验拦截,未调整任务、代码、配置却突发报错的核心原因有两个:
- 2022年6月微软推送的Synapse引擎版本更新,补全了此前MERGE语句未拦截「更新分布键」操作的校验漏洞:旧版本引擎存在规则遗漏,哪怕MERGE逻辑包含分布键更新也不会抛错,可能静默引发数据跨节点移动、数据倾斜问题,新版本加上强校验后直接拦截违规语法,才会出现原有正常运行的任务突然失败的情况。
- 你的MERGE语句
Merge_XX的UPDATE子句中,本身就包含了目标事实表Fact_XX的分布键字段赋值逻辑,只是之前引擎没有做拦截才一直运行。
分布式表的分布键决定了数据在计算节点的分片存储位置,更新分布键会触发数据跨节点重分布,执行成本极高且容易引发一致性问题,因此引擎从语法层面直接禁止了MERGE语句中更新分布键的操作,对应错误码100090就是该规则的拦截提示。
修复步骤
- 首先定位目标表的分布键:在对应SQL库执行以下语句,查询结果中
is_distribution_key = 1的字段即为当前表的分布列
SELECT name, is_distribution_key FROM sys.columns WHERE object_id = OBJECT_ID('Fact_XX')
- 检查
Merge_XX对应的MERGE代码,找到WHEN MATCHED THEN UPDATE后的赋值列表,把所有涉及分布键的赋值逻辑全部删除,哪怕是target.分布键字段 = source.分布键字段这类同值赋值也不能保留,只要字段出现在UPDATE赋值列表中就会触发校验拦截。修改完成后重跑任务即可恢复。 - 如果业务逻辑确实要求更新某条记录的分布键值,不能直接通过MERGE/UPDATE语句实现,需要拆分逻辑实现:
- 先将需要更新分布键的目标记录从事实表中删除
- 再将修改完分布键值的记录作为新行插入到事实表中
- 如果是近期有人误修改了
Fact_XX的分布键设置,直接将表的分布键调整为原有的、不会被MERGE逻辑更新的字段,重跑任务即可恢复。
内容的提问来源于stack exchange,提问作者Berkay ÇİLOĞLU
相关产品推荐
相关产品推荐

