基本上我想将查询结果分配给自定义类型属性。但是我注意到直接从 PostgreSQL 控制台查询大约是 0.071 毫秒,在函数内部是 0.400 毫秒和几次调用后的 0.170 毫秒。explain analyze
甚至在第一种情况下显示索引的使用,但在第二种情况下不显示。
这就是我正在做的事情。
CREATE OR REPLACE FUNCTION fun_isliked(
par_client client.id%type,
par_feed feed.id%type
)
RETURNS boolean
AS
$$
BEGIN
RETURN (
EXISTS(
SELECT
1
FROM
feedlike fl
WHERE
fl.client = par_client
AND fl.feed = par_feed
AND fl.state = 1
)
);
END;
$$ LANGUAGE plpgsql STABLE;
以下是explain analyze
上述两种情况的输出:
postgres=# explain analyze select exists (select 1 from feedlike where client = 13 and feed = 68 and state = 1);
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------------
Result (cost=8.30..8.31 rows=1 width=0) (actual time=0.037..0.037 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Index Scan using feedlike_client_feed_unique on feedlike (cost=0.28..8.30 rows=1 width=0) (actual time=0.034..0.034 rows=1 loops=1)
Index Cond: ((client = 13) AND (feed = 68))
Filter: (state = 1)
Total runtime: 0.086 ms
postgres=# explain analyze select * from fun_isliked(13, 68);
QUERY PLAN
----------------------------------------------------------------------------------------------------------
Function Scan on fun_isliked (cost=0.25..0.26 rows=1 width=1) (actual time=0.398..0.398 rows=1 loops=1)
Total runtime: 0.416 ms
为了在函数内有效地获得相同的运行时,有什么可能的解决方法?甚至可能吗?另外,我正在运行 PostgreSQL 9.3。
我发现SO 中的这个问题有我需要的东西,但是在我尝试了所选答案中的所有内容并且在减少运行时间方面没有成功之后,我决定提出一个新问题。