云数据库 GAUSSDB-语句下推调优:不支持下推的函数

时间:2024-01-23 20:09:20

不支持下推的函数

首先介绍函数的易变性。在 GaussDB 中共分三种形态:

  • IMMUTABLE

    表示该函数在给出同样的参数值时总是返回同样的结果。

  • STABLE

    表示该函数不能修改数据库,对相同参数值,在同一次表扫描里,该函数的返回值不变,但是返回值可能在不同SQL语句之间变化。

  • VOLATILE

    表示该函数值可以在一次表扫描内改变,因此不会做任何优化。

函数易变性可以查询pg_proc的provolatile字段获得,i代表IMMUTABLE,s代表STABLE,v代表VOLATILE。另外,在pg_proc中的proshippable字段,取值范围为t/f/NULL,这个字段与provolatile字段一起用于描述函数是否下推。

  • 如果函数的provolatile属性为i,则无论proshippable的值是否为t,则函数始终可以下推。
  • 如果函数的provolatile属性为s或v,则仅当proshippable的值为t时,函数可以下推。
  • random,exec_hadoop_sql,exec_on_extension如果出现CTE中,也不下推。因为这种场景下下推可能出现结果错误。

对于用户自定义函数,可以在创建函数的时候指定provolatile和proshippable属性的值,详细请参考CREATE FUNCTION

对于函数不能下推的场景:

  • 如果是系统函数,建议根据业务等价替换这个函数。
  • 如果是自定义函数,建议分析客户业务场景,看函数的provolatile和proshippable属性定义是否正确。
support.huaweicloud.com/devg-v1-gaussdb/gaussdb_devg_0315.html