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 の 2 番目の回答です。さらに、LIMIT と OFFSET をブラック ボックス関数に適用する方法は 1 つしかないことを指摘します。しかし、それらをクエリに適用する方法は複数あるかもしれません - 原則として少なくとも。LIMIT は、オプティマイザーによって確実に考慮されます (多くの場合、返されるよりも多くの行を生成することを回避できます)。OFFSET は、実際にはまったく最適化されておらず、より複雑なケースでは「最適化の障壁」としても機能します。OFFSET 句を含むサブクエリがある場合、それはメイン クエリとは別に計画され、メイン クエリに折りたたまれません。

もちろん、最終的には、最初に読みやすさと使いやすさを心配する必要があります。関数が使用されるすべての場所で、制限/オフセットを関数の内側または外側に隠す方が良いでしょうか?

于 2010-09-23T13:03:32.397 に答える
0

大きなテーブルの場合、何十万行も高速に選択されます * from test(); 本体関数内のページングにより、多くの行が削除されます。行数が少ないほど早くなります。

于 2010-09-23T12:03:45.373 に答える