在对行进行任何更新时(这有点愚蠢,我希望在文档页面上会出现性能警告),或者它是否足够聪明,能够分析生成表达式,并仅在输入列发生变化时重新生成计算列?
llmtgqce1#
从文档中可以清楚地看到
所以看起来 generated always 列是generated always。下面是一个小测试用例来验证我们定义了一个在公式中使用的 immutable 函数,其中包含pg_sleep,以便 * 查看 * 该函数是否被调用
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
无需等待,因此似乎存在仅在必要时调用公式的优化步骤。
这是完全有道理的,但当然你应该小心,因为这种行为没有记录,可能会改变...
1条答案
按热度按时间llmtgqce1#
从文档中可以清楚地看到
所以看起来 generated always 列是generated always。
下面是一个小测试用例来验证
我们定义了一个在公式中使用的 immutable 函数,其中包含
pg_sleep
,以便 * 查看 * 该函数是否被调用表DDL
插入
如预期我们等待10秒
更新公式中使用的列
再次预期等待
更新公式中未使用的列
无需等待,因此似乎存在仅在必要时调用公式的优化步骤。
这是完全有道理的,但当然你应该小心,因为这种行为没有记录,可能会改变...