数据仓库服务 GAUSSDB(DWS)-更新报错ERROR:Non-deterministic UPDATE:原因分析

时间:2024-05-07 20:29:47

原因分析

当一条SQL语句中同一个元组被多次更新,执行便会报错ERROR:Non-deterministic UPDATE。

可以看到更新操作分成两步执行:

  1. 通过关联操作查找满足更新条件的元组。
  2. 执行更新操作。

针对上述案例,对于表public.t1中元组 (1, 1)来说,表public.t2中满足更新条件t1.a = t2.a的记录有两条,分别为(1, 1), (1, 2);按照执行器逻辑表t2的元组 (1, 1)需要被更新两次,那么就可能出现两种情况:

  1. 表public.t1和表public.t2关联时先命中(1, 1),再命中(1, 2),这时public.t1的元组(1, 1),先被更新为(1,1),再被更新为(1,2),最终结果为(1, 2)。
  2. 表public.t1和表public.t2关联时先命中(1, 2),再命中(1, 1),这时public.t1的元组(1, 1),先被更新为(1,2),再被更新为(1,1),最终结果为(1, 1)。

实际执行过程中public.t2表输出结果集的顺序会影响update语句的最终输出结果(实际业务中表public.t2的位置可能是一个非常复杂的子查询),导致了update语句执行结果的随机性,而这个实际业务中是无法接受的。

support.huaweicloud.com/trouble-dws/dws_09_0129.html