2010-09-23 97 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