2010-09-23 168 views
1

我想知道在plpgsql函数体和函数调用中添加LIMIT和OFFSET是否有区别。Postgresql优化问题

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; 

回答

0

对于大表百thousends行更快的将是SELECT * FROM测试(); 在身体功能内部寻呼消除了许多行。越早排越好。

2

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

最后,当然,您应该首先担心可读性和可用性:在函数内部或者在函数使用的每个地方隐藏极限/偏移量更好吗?

+0

如果它在功能之外,从开发人员的角度来看它更加灵活 – 2010-09-23 13:42:20