在 PG 14 的文档中,在 参考资料CREATE FUNCTION
部分中,手册指出函数的主体LANGUAGE SQL
可以是单个语句:
RETURN expression
Run Code Online (Sandbox Code Playgroud)
或一个块:
BEGIN ATOMIC
statement;
statement;
...
statement;
END
Run Code Online (Sandbox Code Playgroud)
没有对该块的语义给出任何解释。这看起来类似于BEGIN ... END;
PL/pgSQL 中的块,但似乎有些不同。
在 内 或 外 写一组语句有什么区别BEGIN ATOMIC ... END
?什么时候需要使用这样的块?关键字是ATOMIC
强制的吗?
Postgres 函数声明为波动性分类VOLATILE
,STABLE
或IMMUTABLE
。众所周知,该项目对内置函数的这些标签非常严格。并且有充分的理由。突出的例子:表达式索引只允许IMMUTABLE
函数并且那些必须是真正不可变的以避免错误的结果。
用户定义的函数仍然可以按照所有者的选择自由声明。手册建议:
为了获得最佳优化结果,您应该使用对它们有效的最严格的波动率类别来标记您的函数。
...并添加了大量可能因波动率标签不正确而出错的事情列表。
尽管如此,在某些情况下,伪造不变性是有道理的。大多数情况下,当您知道该函数实际上在您的范围内是不可变的。例子:
除了对数据完整性的所有可能影响之外,对性能的影响是什么?人们可能认为声明一个函数IMMUTABLE
只会对性能有益。是这样吗?
声明函数波动性会IMMUTABLE
损害性能吗?
让我们假设当前的 Postgres 10 来缩小范围,但所有最近的版本都很有趣。