【发布时间】:2022-12-12 10:30:20
【问题描述】:
我正在尝试定义自定义函数,我想知道如何计算该函数的估计成本
https://www.postgresql.org/docs/current/sql-createfunction.html
我尝试给出不同的成本函数值,但无法找到如何估算该成本。
【问题讨论】:
标签: postgresql plpgsql
我正在尝试定义自定义函数,我想知道如何计算该函数的估计成本
https://www.postgresql.org/docs/current/sql-createfunction.html
我尝试给出不同的成本函数值,但无法找到如何估算该成本。
【问题讨论】:
标签: postgresql plpgsql
如果我足够关心打扰,我会做实验。
例如,如果您的函数采用双精度,您可以比较:
explain analyze select sqrt(x::double precision) from generate_series(1,1000000) f(x);
至
explain analyze select your_func(x::double precision) from generate_series(1,1000000) f(x);
然后找到使成本估计的比率与实际时间的比率大致匹配的成本设置。
您可以尝试减去 generate_series 和 cast 的基线成本,但是如果您的函数的添加时间太小以至于可以保证如此精确,那么它可能小到足以使成本为 1 而不必担心它。
【讨论】:
postgresql 用于计算解释成本的公式加上下面解释的一些示例:
SELECT relpages*current_setting('seq_page_cost')::numeric +
reltuples*current_setting('cpu_tuple_cost')::numeric as cost
FROM pg_class
WHERE relname='tablename';
您可以使用 EXPLAIN 查看正在执行的计算机上每个查询的 CPU 成本。
CREATE OR REPLACE FUNCTION a() RETURNS SET OF INTEGER AS $$
SELECT 1;
$$
LANGUAGE SQL;
EXPLAIN SELECT * FROM a() CROSS JOIN (Values(1),(2),(3)) as foo;
Nested Loop (cost=0.25..47.80 rows=3000 width=8)
-> Function Scan on a (cost=0.25..10.25 rows=1000 width=4)
-> Materialize (cost=0.00..0.05 rows=3 width=4)
-> Values Scan on "*VALUES*" (cost=0.00..0.04 rows=3 width=4)
(4 rows)
如果 COST 0.0001 AND 10000 的两个函数与 SELECT 语句的谓词同时执行,查询规划器将首先执行成本 0.0001 的函数,然后才执行 10000 成本条件,如下面的示例所示。
EXPLAIN SELECT * FROM pg_language WHERE lanname ILIKE '%sql%' AND slow_
function(lanname)AND fast_function(lanname);
QUERY PLAN
-------------------------------------------------------------------------
Seq Scan on pg_language (cost=0.00..101.05 rows=1 width=114)
Filter: (fast_function(lanname) AND (lanname ~~* '%sql%'::text) AND
slow_function(lanname))
(2 rows)
【讨论】:
select f(table) from table; 的一部分