数据仓库服务 GAUSSDB(DWS)-DWS查询时结果不一致的常见场景和解决方法:自定义函数属性设置不合理
自定义函数属性设置不合理
场景:自定义函数get_count()并调用该函数出现结果不一致场景。
1 2 3 4 5 6 7 8 9 10 11 |
CREATE FUNCTION get_count() returns int SHIPPABLE as $$ declare result int; begin result = (select count(*) from test); --test表是hash表 return result; end; $$ language plpgsql; |
调用该函数。
1 2 3 4 5 6 7 8 9 10 11 |
SELECT get_count(); get_count ----------- 2106 (1 row) SELECT get_count() FROM t_src; get_count ----------- 1032 (1 row) |
原因分析:
由于该函数指定了SHIPPABLE的函数属性,因此生成计划时该函数会下推到DN上执行,该函数下推到DN后,由于函数定义中的test表是hash表,因此每个DN上只有该表的一部分数据,所以select count(*) from test; 返回的结果不是test表全量数据的结果,而是每个DN上部分数据的结果,因此导致加上from表后函数返回预期发生变化。
解决方法:
以下两种方法任选其一即可(推荐第一种方法):
- 将函数改为不下推:ALTER FUNCTION get_count() not shippable;
- 将函数中用到的表改为复制表,这样每个DN上都是一份该表的全量数据,即使下推到DN执行,也能保证结果集符合预期。