gpt4 book ai didi

sql - Postgres 函数比查询/Postgres 8.4 慢

转载 作者:行者123 更新时间:2023-11-29 11:56:42 27 4
gpt4 key购买 nike

我(必须)使用 Postgres 8.4 数据库。在这个数据库中,我创建了一个函数:

CREATE OR REPLACE FUNCTION counter (mindate timestamptz,maxdate timestamptz) RETURNS integer AS $func$ 
DECLARE result integer;
BEGIN
Select INTO result COUNT(*) AS counter from columname where starttime BETWEEN $1 and $2;
Return result;
END
$func$ LANGUAGE plpgsql;

查询:

apptelemetry=# select counter('2016-03-01 00:00:00','2016-03-11 00:00:00');
requestcounter
----------------
8893
(1 row)

Time: 4.740 ms

当我进行正常查询时:

apptelemetry=# select Count(*) from columname where starttime BETWEEN '2016-03-01 00:00:00' AND '2016-03-11 00:00:00';
count
-------
8893
(1 row)

Time: 3.214 ms

为什么函数比正常查询慢?有人对我有性能提示吗?

注册

最佳答案

PLpgSQL 中的查询是盲目优化的。有时执行计划对于某些参数可能不是最优的。

PLpgSQL 重用任何查询的执行计划。它有一些优点(没有重复的昂贵查询计划),但也有一些缺点(该计划未针对实际值进行优化,而是针对最有可能的值进行了优化)。现代版本的 Postgres 更智能一些。

这个查询的解决方案是动态SQL。在这种情况下,执行计划不会被重用,然后可以针对实际参数值进行优化:

CREATE OR REPLACE FUNCTION counter (mindate timestamptz,maxdate timestamptz) RETURNS integer AS $func$ 
DECLARE result integer;
BEGIN
EXECUTE 'SELECT COUNT(*) FROM columname
WHERE starttime BETWEEN $1 and $2'
INTO result USING mindate, maxdate;
RETURN result;
END
$func$ LANGUAGE plpgsql;

关于此问题的一篇文章:http://blog.endpoint.com/2008/12/why-is-my-function-slow.html

关于sql - Postgres 函数比查询/Postgres 8.4 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com