Postgresql优化问题

时间:2010-09-23 11:47:03

标签: postgresql plpgsql

我想知道在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;

2 个答案:

答案 0 :(得分:2)

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

当然,最终你应该首先担心可读性和可用性:隐藏函数内部的限制/偏移是否更好,或者在使用函数的每个地方都隐藏它?

答案 1 :(得分:0)

对于大型表格,将从test()中选择更快的数十万行; 在体内功能中进行分页会消除许多行。较早的行越多越好。

相关问题