Bro*_*oks 14 postgresql terminology
我不清楚 IMMUTABLE、VOLATILE 和 STABLE 函数定义中的真正含义。
我阅读了文档,特别是每个文档的定义。
IMMUTABLE 表示函数不能修改数据库并且 在给定相同的参数值时总是返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用不直接出现在其参数列表中的信息。如果给出了这个选项,任何带有全常量参数的函数调用都可以立即替换为函数值。
STABLE 表示该函数不能修改数据库,并且在单个表扫描中,对于相同的参数值,它将始终返回相同的结果,但其结果可能会在 SQL 语句之间发生变化。对于结果取决于数据库查找、参数变量(例如当前时区)等的函数,这是合适的选择。(对于希望查询由当前命令修改的行的 AFTER 触发器是不合适的。)另请注意, current_timestamp 系列函数被认为是稳定的,因为它们的值在事务中不会改变。
VOLATILE 表示即使在单个表扫描中函数值也可以更改,因此无法进行优化。从这个意义上说,相对较少的数据库函数是易变的;一些例子是 random()、currval()、timeofday()。但请注意,任何具有副作用的函数都必须归类为 volatile,即使其结果是可预测的,以防止调用被优化掉;一个例子是 setval()。
我的困惑来自与不可改变的条件,稳定的功能总是或始终返回相同的结果给出了相同的论点。
IMMUTABLE 定义声明该函数不进行数据库查找或以其他方式使用未直接出现在其参数列表中的信息。所以,对我来说,这意味着这些函数用于操作客户端提供的数据,并且不应该有 SELECT 语句......尽管这对我来说听起来有点奇怪。
对于 STABLE,定义类似,因为它说它应该始终如一地返回相同的结果。所以,对我来说,这意味着每次使用相同的参数调用函数时,它都应该返回相同的结果(每次都返回相同的行)。
所以,对我来说......这意味着任何对一个或多个可以更新的表执行 SELECT 的函数应该只是易失性的。
但是,再一次……这对我来说听起来不对。
回到我的用例,我正在编写在不断添加的表上执行带有多个 JOIN 的 SELECT 语句的函数,因此函数调用预计每次调用时都会返回不同的结果,即使使用相同的参数.
那么,这是否意味着我的函数应该是 VOLATILE?即使文档表明相对较少的数据库函数在这个意义上是易变的?
谢谢!
Cra*_*ger 23
IMMUTABLE必须是纯函数,其结果仅取决于其输入。这是一个非常严格的要求;它们不能调用其他非不可变函数,不能访问表,不能访问配置属性的值等。
STABLE可以使用任何输入本身STABLE:其他STABLE或IMMUTABLE函数,以及SELECT表的查询。查询表是安全的,因为这些表的函数视图不会在查询的当前快照内更改。您可以访问 GUC 值 ( current_setting(...)),只要您知道它们不会也被分配到当前语句中。
VOLATILE 函数是不符合上述的一切:
一般来说,VOLATILE除非你有充分的理由不这样做,否则就放弃一切。
使用的主要原因IMMUTABLE是在编写用作索引表达式一部分的函数时。
对于 STABLE,您需要加粗的部分是“结果可能会在 SQL 语句之间发生变化”
不可变的东西不应该永远改变。即使您重新启动数据库服务器,运行yum update(当然可以有虫子!),更改配置(如datestyle,timezone,default_text_search_config,extra_float_digits,等),或完全替代服务器硬件(相同的架构旧硬件的,所以二进制文件仍然兼容)。
您描述的函数听起来像是稳定的,因为在单个 SQL 语句中,它们将使用与外部查询相同的快照执行查询,因此您对其他表所做的任何并发更改都将不可见。现在,如果您的函数打开了一个到服务器的新连接并在该独立连接中运行它们的查询,这将使函数变得不稳定,因为它们将使用不同的快照。
| 归档时间: |
|
| 查看次数: |
14519 次 |
| 最近记录: |