postgresql (存储的)生成列何时重新生成?

icomxhvb  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(1)|浏览(137)

在对行进行任何更新时(这有点愚蠢,我希望在文档页面上会出现性能警告),或者它是否足够聪明,能够分析生成表达式,并仅在输入列发生变化时重新生成计算列?

llmtgqce

llmtgqce1#

从文档中可以清楚地看到

  • 存储的生成列在写入(插入或更新)时计算 *,并像普通列一样占用存储空间。虚拟的生成列不占用存储空间,并在读取时计算。因此,虚拟的生成列类似于视图,存储的生成列类似于实体化视图(除了 * 它始终自动更新 *)。

所以看起来 generated always 列是generated always
下面是一个小测试用例来验证
我们定义了一个在公式中使用的 immutable 函数,其中包含pg_sleep,以便 * 查看 * 该函数是否被调用

create or replace function wait10s(x numeric)
returns int
as $$
  SELECT pg_sleep(10);
  select x as result;
$$ language sql IMMUTABLE;

表DDL

create table t 
(col1 numeric,
col2 numeric,
gen_col numeric generated always as ( wait10s(col2) ) STORED
);

插入

如预期我们等待10秒

insert into t (col1, col2) values (1,1);

更新公式中使用的列

update t set col2 = 2

再次预期等待

更新公式中未使用的列

update t set col1 = 2

无需等待,因此似乎存在仅在必要时调用公式的优化步骤。

这是完全有道理的,但当然你应该小心,因为这种行为没有记录,可能会改变...

相关问题