我正在尝试定义自定义函数,我想知道如何计算该函数的预估成本。我尝试给出不同的成本函数值,但无法找到如何估算成本的方法。
参考链接:https://www.postgresql.org/docs/current/sql-createfunction.html
参考链接:https://www.postgresql.org/docs/current/sql-createfunction.html
PostgreSQL使用的计算解释成本的公式以及以下一些解释示例,必须对表中的所有内容进行求和(索引、外键、序列): 参考资料:https://postgrespro.com/blog/pgsql/5969403
SELECT relname , 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)
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)
如果我在乎并且想要尝试,我会进行实验。
例如,如果您的函数需要双精度,可以进行比较:
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,不必担心它。
select f(table) from table;
的一部分。 - Amarjeet Kapoor