首页 > 解决方案 > 可以将表作为参数的函数声明为 IMMUTABLE 吗?

问题描述

假设一个表定义如下:

CREATE TABLE clients (
    active BOOLEAN
    ,deceased BOOLEAN
);

我定义了一个特定于该表的函数(我不记得它是如何调用的,也无法在CREATE FUNCTION文档或搜索引擎中找到它):

CREATE FUNCTION isvisible(clients) RETURNS BOOLEAN
AS $BODY$
BEGIN
  RETURN $1.active AND NOT $1.deceased;
END;
$BODY$ LANGUAGE plpgsql STABLE;

然后我得到客户列表:

SELECT * FROM clients c WHERE c.isvisible;

在实际表中,有几个字段可以改变记录的可见状态(主要在客户列表中)。我计划拥有这样的功能,以便整个应用程序的可见状态保持一致。

  1. 将这样的函数声明为 IMMUTABLE 是否安全?我想知道,因为任何真实字段(即:activedeceased)都可能在事务中发生变化。
  2. 我想尽量减少这种功能可能导致的性能下降。并且由于我有几个想要实现此类辅助函数的案例,因此在概括这个概念之前,我想听听您的建议。

标签: postgresql

解决方案


如果你关心性能,你应该把它变成一个language sql函数,这样它就可以被内联

CREATE FUNCTION isvisible(p_row clients) 
  RETURNS BOOLEAN
AS $BODY$
  select p_row.active AND NOT p_row.deceased;
$BODY$ 
LANGUAGE sql 
STABLE;

即使它没有内联,SQL 函数仍然比 PL/pgSQL 函数更有效(参见例如这里


正如 Laurenz Albe 在评论中指出的那样,将该函数标记为不可变是安全的。


推荐阅读