如何确定是否可以内联 SQL 函数?

Eva*_*oll 3 postgresql performance optimization execution-plan functions

这个答案中, Erwin 将IMMUTABLE函数分解为可以内联的函数和不能内联的函数。他有一个例子to_char(),表明IMMUTABLE函数 overto_char()实际上会更慢

不过这很有趣,因为我什至不知道to_char()不是IMMUTABLE。此外,我不知道这IMMUTABLE会让任何事情变得更慢。我现在的问题是,如何确定标记为IMMUTABLE内联的函数是否被内联?

Erw*_*ter 6

由于它改变了实际的执行计划,您可以从EXPLAIN (ANALYZE, VERBOSE)(除其他外)的输出中看出: 示例:

EXPLAIN (ANALYZE, VERBOSE) SELECT my_func(col) FROM tbl;
Run Code Online (Sandbox Code Playgroud)

我从你所指的答案中简化并改编了小提琴:

db<>在这里摆弄

第一个函数是内联的,因此您会在输出中看到内联的表达式:

Output: (to_char((d)::timestamp with time zone, 'MMDD'::text))::integer
Run Code Online (Sandbox Code Playgroud)

第二个函数没有内联,因此您会在输出中看到函数调用:

Output: f_mmdd_tc_i(d)
Run Code Online (Sandbox Code Playgroud)

准确地说:这表明该函数是否已在测试查询中内联。如果没有,那并不一定证明它不能(在不同情况下)。
并且测试并不仅限于IMMUTABLE任何方式的功能。