SeaboxMPP函数的执行
SeaboxMPP内置函数类型¶
SeaboxMPP数据库是由多个SeaboxSQL数据库实例组成的分布式分析型数据库, 相关函数执行具备分布式特点。SeaboxMPP数据库评估SQL表达式中使用的函数和运算符。
某些函数和运算符只允许在Coordinator节点上上执行,因为它们可能导致数据库集群Executor实例中的不一致。
该表描述了SeaboxMPP数据库函数类型。
函数类型 | SeaboxMPP是否支持 | 描述 | 注释 |
---|---|---|---|
IMMUTABLE | 是 | 仅依赖于其参数列表中的信息。给定相同的参数值,始终返回相同的结果。 | |
STABLE | 在大多数情况下是的 | 在单个表扫描中,对相同的参数值返回相同的结果,但结果将通过SQL语句进行更改。 | 结果取决于数据库查找或参数值。 current_timestamp 系列函数是STABLE ; 值在执行中不会改变。 |
VOLATILE | 受限制的 | 函数值可以在单个表扫描中更改。例如: random() , timeofday() 。 |
任何具有副作用的函数都是易变的,即使其结果是可预测的。 例如:setval() 。 |
Table 1. SeaboxMPP数据库中的函数
在SeaboxMPP数据库中,数据跨Executor分布 - 每个Executor是不同的SeaboxSQL数据库。
为了防止出现不一致或意外的结果,如果它们包含SQL命令或以任何方式修改数据库,则不要在Executor级别执行归类为VOLATILE
的函数。
例如,不允许在SeaboxMPP数据库中对分布式数据执行诸如setval()
之类的函数,因为它们可能导致Executor实例之间的数据不一致。
为确保数据一致性,可以在Coordinator节点上评估和运行的语句中安全地使用VOLATILE
和STABLE
函数。
例如,以下语句在Coordinator上运行(没有FROM
子句的语句):
SELECT setval('myseq', 201);
SELECT foo();
如果语句具有包含分布式表的FROM
子句,并且FROM
子句中的函数返回一组行,则该语句可以在Executor上运行:
SELECT * from foo();
SeaboxMPP数据库不支持返回表引用(rangeFuncs
)的函数或使用refCursor
数据类型的函数。