本文分享自华为云社区《GaussDB(DWS)函数下推属性介绍》,原文作者:Arrow0lf。

用户在使用GaussDB(DWS)时,应该正确指定函数属性,错误指定函数属性不仅会导致查询语句执行效率低,而且可能会导致结果集不稳定的情况。本文简单介绍GaussDB(DWS)函数下推属性的相关知识,并提供几个函数属性相关的典型案例供大家参考。

1. 函数下推属性介绍

GaussDB(DWS)创建函数时,可以指定许多函数属性,其中,与函数下推相关的属性为易失性级别 下推属性,其中:

易失性:

  • IMMUTABLE:该属性的函数不会修改数据库,并且保证在任何情况下同样的输入参数永远返回同样的结果;
  • STABLE:该属性的函数不会修改数据库,并且保证在同一个查询中,对于同样的输入参数,函数返回的结果相同;
  • VOLATILE:该属性的函数对于同样的输入参数,函数的返回结果可能不通,典型的如timeofday,创建函数时如果未明确指定,则默认为VOLATILE

下推属性:

  • SHIPPABLE:函数可以下推到DN执行
  • NOT SHIPPABLE:函数不能下推到DN执行,创建函数时如果未明确指定,则默认为NOT SHIPPABLE

在GaussDB(DWS)中,IMMUTABLE属性的函数时一定能够下推到DN执行的,不管下推属性是否为SHIPPABLE,对于STABLE和VOLATILE属性的函数,函数是否能下推要看指定的SHIPPABLE属性。因此,在创建函数时如果同时指定了IMMUTABLE 和 NOT SHIPPABLE的属性,函数创建成功时会有以下提示:

NOTICE:  Immutable function will be shippable anyway.

2. 函数下推属性典型案例

案例一:未指定函数易失性级别导致函数不下推

函数定义如下:

create function try_cast_int(p_in text, p_default int default 0) returns int
as $$
beginbeginreturn $1::int;exceptionwhen others thenreturn p_default;end;
end;
$$
language plpgsql;

由于创建函数时未明确指定函数易失性级别和函数属性,函数默认为VOLATILE NOT SHIPPABLE,使用该函数时执行计划如下:

postgres=# explain verbose select try_cast_int(b) from test order by a;QUERY PLAN
--------------------------------------------------------------------------------------Sort  (cost=13.91..14.04 rows=50 width=36)Output: (try_cast_int(test.b, 0)), test.aSort Key: test.a->  Data Node Scan on "__REMOTE_SORT_QUERY__"  (cost=0.00..12.50 rows=50 width=36)Output: try_cast_int(test.b, 0), test.aNode/s: All datanodesRemote query: SELECT a, b FROM ONLY public.test WHERE true ORDER BY 1
(7 rows)

可以看出该sql执行计划不下推,执行效率较低,分析该函数发现该函数可以指定为IMMUTABLE属性,让该函数可以下推,因此,可以通过以下方式优化:

ALTER FUNCTION try_cast_int(text,int) IMMUTABLE;

案例二:错误指定了函数下推属性导致结果集不稳定

下推函数能够下推到DN执行,与不下推函数相比有着更高的执行效率,有时开发者为了加快函数执行效率,所有自定义函数创建时都会指定为SHIPPABLE,某函数定义如下:

create function get_count() returns int
SHIPPABLE
as $$
declareresult int;
beginresult = (select count(*) from test);  --test表是hash表return result;
end;
$$
language plpgsql;

调用该函数发现以下现象:

postgres=# select get_count();get_count
-----------2106
(1 row)postgres=# select get_count() from t_src;get_count
-----------1032
(1 row)

发现加上from表之后函数的返回值结果发生了变化!为什么会出现这种情况呢?这是因为由于这个函数指定了SHIPPABLE的函数属性,因此生成计划时该函数会下推到DN上执行,该函数下推到DN后,由于函数定义中的test表是hash表,因此每个DN上只有该表的一部分数据,所以select count(*) from test返回的结果不是test表全量数据的结果,而是每个DN上部分数据的结果,因此导致加上from表后函数返回预期发生变化,优化方法:

(1)将函数改为不下推:alter function get_count() not shippable;

(2)将函数中用到的表改为复制表,这样每个DN上都是一份该表的全量数据,即使下推到DN执行,也能保证结果集符合预期。

3. 总结

创建自定义函数时,要正确指定函数的属性,确保函数属性符合预期,防止因函数属性设置不正确导致的性能下降或结果集不稳定。

点击关注,第一时间了解华为云新鲜技术~

你的数仓函数结果不稳定,可能是属性指定错了相关推荐

  1. MySQL—数仓ETL开发中常用到的日期函数

    在数据仓库ETL开发中,当以增量的方式进行数据同步时,会将数据表中的时间字段作为增量字段获取增量数据.对于MySQL数据库来说,总结了以下日期表示以及需要注意的问题. 一.需要注意的问题: 查看MyS ...

  2. 网易严选数仓任务治理实践

    ‍背景 在过去的2020年,网易严选在数据任务治理方面存在一些迫切希望改善及提升的点,2020年初在部门负责人和杭研数科领导的带领下,正式组建团队以"共建"的方式来解决这些希望改善 ...

  3. 大数据面试题--数仓

    目录 数据仓库理论 数据分层 E T L 星形模型与雪花模型的区别? 维度建模(dimensional modeling): 数据仓库项目最重要或需要注意的是什么,以及如何处理? 关系建模与维度建模 ...

  4. ODS DWD DWS ADS 数仓分层

    数仓分层 ODS:Operation Data Store 原始数据 DWD(数据清洗/DWI ) data warehouse detail 数据明细详情,去除空值,脏数据,超过极限范围的明细解析 ...

  5. Hive 数仓中常见的日期转换操作

    (1)Hive 数仓中一些常用的dt与日期的转换操作 下面总结了自己工作中经常用到的一些日期转换,这类日期转换经常用于报表的时间粒度和统计周期的控制中 日期变换: (1)dt转日期 to_date(f ...

  6. sql order by 降序_数仓面试|四个在工作后才知道的SQL密技

    SQL是大数据从业者的必备技能,大部分的大数据技术框架也都提供了SQL的解决方案.可以说SQL是一种经久不衰.历久弥新的编程语言.尤其是在数仓领域,使用SQL更是家常便饭.本文会分享四个在面试和工作中 ...

  7. hive udf 分组取top1_项目实战从0到1之hive(27)数仓项目(九)数仓搭建 DWS 层

    点击上方蓝字关注我们 一.数仓搭建 - DWS 层 1.1 业务术语 1)用户 用户以设备为判断标准,在移动统计中,每个独立设备认为是一个独立用户.Android 系统根据 IMEI 号,IOS 系统 ...

  8. select隐藏_数仓|几种SQL隐藏的错误,你遇到过吗?

    本文分享主要描述了几种书写SQL时常见的一些隐藏错误,主要包括:在运算符中使用null值.在聚合数据时使用null值.求平均值时使用判断条件.滤条件中使用and和or.查询的列字段之间缺少逗号分隔.i ...

  9. 区分错误类型_数仓|几种SQL隐藏的错误,你遇到过吗?

    本文分享主要描述了几种书写SQL时常见的一些隐藏错误,主要包括:在运算符中使用null值.在聚合数据时使用null值.求平均值时使用判断条件.滤条件中使用and和or.查询的列字段之间缺少逗号分隔.i ...

最新文章

  1. android 自定义正方形 绕中心点旋转
  2. (转)python中的*args和**kw到底是个啥。看下面的例子就会懂了
  3. The greatest happiness 2019-11-13
  4. 查看当前提供了哪些引擎
  5. 【软件测试】白盒测试のN-S图
  6. 错误Unable to find manifest signing certificate in the certificat...
  7. java编码问题汇总
  8. 【拆机】小米路由器4
  9. ArcGIS的ArcMap的Mxd格式符号转换为Geoserver style的sld格式
  10. 服务器雷达信号处理,雷达信号处理的信息几何方法
  11. ssh 远程连接详解--(linux运维09)
  12. ViewPager2撸个3D画廊
  13. msvcr71.dll控件常规安装
  14. 【单目3D检测】Monoflex论文阅读
  15. linux centos 权限审核 polkitd进程 简介
  16. 为什么今年高考数学又出编程题?
  17. 关于JS按钮倒计时禁用的小Demo
  18. Stream流中常用的方法
  19. 地质灾害防治网格化管理平台
  20. 工作总结--如何定位web系统前后台的bug,以及bug分析/测试感想

热门文章

  1. 大佬 | 从啥也不会,到Java大佬,他就因为会了这一门绝技
  2. Bootstrap3 Font Awesome 字体图标
  3. Bootstrap 流式布局
  4. CSS3 响应式布局实例
  5. Integer 数据类型
  6. 基于固定坐标与基于参考坐标系得到的机械手的微分运动不同
  7. Git笔记(31) 重置揭密
  8. dubbo源码深度解析_scrapy框架通用爬虫、深度爬虫、分布式爬虫、分布式深度爬虫,源码解析及应用
  9. 中移物联网答案java_【分享】中移物联网校园招聘笔试-java
  10. 输入一批整数,输出最大最小值,输入0结束