1

我想知道在 plpgsql 函数体和函数调用中添加 LIMIT 和 OFFSET 之间是否有任何区别。

CREATE FUNCTION test ()
RETURNS record AS
$body$
DECLARE
BEGIN
    select * from producent order by id limit 5 offset 10;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

CREATE FUNCTION test1 ()
RETURNS record AS
$body$
DECLARE
BEGIN
    select * from producent order by id;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER;

这将更快:

select * from test();

或者

select * from test1() limit 5 offset 10;
4

2 回答 2

2

我第二个 iddqd 的回答,另外我要指出只有一种方法可以将 LIMIT 和 OFFSET 应用于黑盒函数;但在查询中应用它们的方法可能不止一种——至少原则上是这样。LIMIT 肯定会被优化器考虑在内(它通常可以避免生成比返回更多的行)。我相信,OFFSET 根本没有真正优化,甚至在更复杂的情况下充当“优化障碍”;如果您有一个带有 OFFSET 子句的子查询,那么它将与主查询分开计划,而不是折叠到其中。

归根结底,当然,您应该首先担心可读性和可用性:将限制/偏移隐藏在函数内部还是在使用函数的每个地方都隐藏在函数外部更好?

于 2010-09-23T13:03:32.397 回答
0

对于大表百千行更快将是 select * from test(); 正文功能内的分页消除了许多行。越早越少行越好。

于 2010-09-23T12:03:45.373 回答