数据仓库服务 GAUSSDB(DWS)-GaussDB(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执行,也能保证结果集符合预期。
- GaussDB(DWS)常用SQL_常用SQL命令_SQL语法
- 数据仓库服务GaussDB(DWS)_SQL on Anywhere
- DWS安全_数据仓库服务安全_DWS数据安全管理_DWS安全保障_DWS安全策略
- DWS资源管理_GaussDB(DWS)资源管理作用_DWS资源管控
- 调用GaussDB(DWS) API接口_数据仓库服务调用API_如何调用API_在DWS中调用API
- GaussDB(DWS)服务_什么是IoT数仓_如何使用IoT数仓
- DWS产品介绍_DWS产品优势_DWS功能_DWS使用场景_DWS是什么
- 华为GaussDB自定义函数_GaussDB教程_华为高斯数据库自定义函数
- GaussDB数据库自定义函数_GaussDB 华为_高斯数据库自定义函数
- GAUSS(DWS)工具_gsql工具_DataStudio工具_DSC工具