使用函数和操作符
更多有关Greenplum数据库函数易变性分类的信息请参考PostgreSQL的函数易变性分类文档。
在Greenplum数据库中,数据被划分在Segment上 — 每个Segment是一个独特的PostgreSQL数据库。为了防止不一致或者预期之外的结果,如果分类为VOLATILE的函数以任何形式包含SQL命令或修改数据库,不要在Segment层面上执行它。例如,在Greenplum数据库中不允许在分布数据上执行setval()之类的函数,因为它们可能导致Segment实例间不一致的数据。
为了确保数据一致性,可以在从Master计算和运行的语句中安全地使用VOLATILE以及STABLE函数。例如,下面的运行在Master(没有FROM子句的语句)上的语句:
如果语句的FROM子句中包含一个分布表并且FROM子句中的函数返回一个行集合,则该语句可以运行在Segment上:
Greenplum数据库不支持返回表引用(rangeFuncs)的函数或者使用refCursor数据类型的函数。
简单的交互式查询会被规划然后立即执行,对这类查询来说STABLE和IMMUTABLE函数易变性分类之间的区别相对较小。一个函数是在规划时被执行一次或是在查询执行启动时被执行一次关系并不大。但是当用户保存计划并且在后来重用它时,区别就非常大了。如果把一个函数误标为IMMUTABLE,Greenplum数据库可能在规划时会过早地把它折叠成一个常量,可能在该计划的后续执行中重用到一个不新鲜的值。在使用PREPARE语句或者使用PL/pgSQL这种缓冲计划的语言时可能会遇到这种危险。
Greenplum数据库支持用户定义的函数。更多信息请见PostgreSQL文档中的。
使用CREATE FUNCTION语句注册用户定义的函数,它们可以按在Greenplum数据库中使用函数中所述的方式被使用。默认情况下,用户定义的函数被声明为VOLATILE,因此如果用户定义的函数是IMMUTABLE或者STABLE,必须在注册该函数时指定正确的易变性级别。
在创建用户定义的函数时,避免使用致命错误或者破坏性的调用。Greenplum数据库可能会用突然的关闭或者重启相应这些错误。
在Greenplum数据库中,用户定义的函数的共享库必须位于Greenplum数据库阵列中所有主机(Master、Segment以及镜像)上的同一库路径位置中。
还可以创建并执行用Greenplum数据库过程语言(例如PL/pgSQL)编写的匿名代码块。匿名块作为短暂的匿名函数运行。有关创建和执行匿名块的信息,请见命令。
下面的表格列出了PostgreSQL支持的内建函数和操作符的分类。Greenplum数据库中支持PostgreSQL中所有的函数和操作符,除了STABLE以及VOLATILE函数之外,这两种服从在Greenplum数据库中使用函数中记录的限制。更多有关这些内建函数和操作符的信息请见PostgreSQL文档中的小节。
Greenplum数据库包括操作json数据类型值的JSON处理函数。有关JSON数据的信息,请见使用JSON数据。
下列内建窗口函数是Greenplum对于PostgreSQL数据库的扩展。所有的窗口函数都是immutable。更多有关窗口函数的信息,请见。
下列内建高级聚集函数是Greenplum对PostgreSQL数据库的扩展。这些函数都是immutable。
注意: 用于分析的Greenplum MADlib扩展提供了额外的高级函数来执行对Greenplum数据库数据的统计分析和机器学习。请见Greenplum数据库参考指南中的Greenplum的MADlib分析扩展。