数据仓库服务 GAUSSDB(DWS)-GaussDB(DWS)查询时结果不一致的常见场景和解决方法:自定义函数属性设置不合理

时间:2024-06-21 18:00:23

自定义函数属性设置不合理

场景:自定义函数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表后函数返回预期发生变化。

解决方法

以下两种方法任选其一即可(推荐第一种方法):

  1. 将函数改为不下推:ALTER FUNCTION get_count() not shippable;
  2. 将函数中用到的表改为复制表,这样每个DN上都是一份该表的全量数据,即使下推到DN执行,也能保证结果集符合预期。
support.huaweicloud.com/dws_faq/dws_03_2107.html