“LANGUAGE plpgsql VOLATILE COST 100”在函数中的含义是什么?

16

我对Postgres触发器比较陌生。我在www.postgresql.org看到了一个触发器的例子,但是我不理解最后这个 LANGUAGE plpgsql VOLATILE COST 100; 是什么意思。

这一行代码有什么用?

我在这个问题相关的Stack Overflow讨论区看到了类似的问题,但只解释了volatile,请问这里的cost 100language是什么意思?


4
这里开始,如果有任何不清楚的地方,请回来。 - Milen A. Radev
2个回答

21

语言 plpgsql 可变成本 100;

语言:用于创建 PostgreSQL 存储过程的编程语言。这里使用的是 plpgsql。

在介绍可变性和成本之前,需要先了解 '查询优化器',我们会提供这些信息给查询优化器,以便它确定执行给定查询的最有效方式。

可变性:在 PostgreSQL 中,每个函数都有一个可变性分类,其中可变是可变性分类之一。可变函数可以做任何事情,包括修改数据库。它是默认值,因此可以省略。

成本 100:成本与可变性完全独立。它声明结果每行的成本,查询计划器用它来查找最便宜的计划。默认值为 COST 100,也可以省略。最好将其保留为默认值。

在这些语句中,我们向查询优化器提供有关函数的信息。这里包括我们使用的语言、函数的可变性以及结果每行的成本。


10

您可以在Postgres中使用更多的编程语言来编写存储过程。所以强制属性LANGUAGE指定了使用的语言 - plpgsql, sql, plpython, plperl, ...

这些函数对于优化器来说是一个黑盒子 - 优化器不知道里面有什么和这段代码有多么昂贵。优化器可以选择SQL查询将如何计算,并且它可以倾向或最小化某些函数的评估。低成本的函数是首选的,而高成本的函数则会受到惩罚。COST是+/-值,表示函数的昂贵程度(函数的快慢)。几乎所有内置函数的COST都为1,pgAdmin对于自定义函数使用COST 100 - 这表明plpgsql函数比内置函数更慢。COST不是线性的 - 所以这并不意味着plpgsql函数比内置函数慢100倍。


“COST不是线性的”,对吧?相关文档说成本是“一个正数,以cpu_operator_cost为单位给出函数的预计执行成本”,而有关成本的文档没有提到对数刻度,尽管它们确实说“只有它们的相对值才重要,因此将它们全部按相同因子缩放或扩大将不会改变规划器的选择。” - Shelvacu
@Shelvacu - 我认为线性/非线性并不是精确的术语。总成本是由部分成本之和计算出来的,这些成本是通过一些公式计算出来的,通常是一些系数一些常数估计值。但这些公式太过合成 - 没有人期望所有成本为1的函数具有相同的速度,或者成本为10的函数比成本为1的函数慢十倍。这些数字是合成的,仅此而已。没有人期望成本和速度之间存在精确的测量关系。只要成本更高的函数应该更慢。有多慢,谁也不知道。 - Pavel Stehule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接