5

この投稿は、カーソルを使用して、制限された速度でクエリからフェッチできることを示しています。どうすればよいですか?

私の目的は、この優先度の低いクエリが他の優先度の高いクエリに与える影響を減らすことです。

4

2 に答える 2

6

DECLAREこれを行うには、次のコマンドを使用してサーバー側カーソルを宣言します。

DECLARE my_cursor CURSOR FOR select * from foo;

FETCH次に、コマンドを繰り返し使用して結果を読み取ります。

FETCH 10 FROM my_cursor;

FETCHコマンドの合間にスリープすることにより、クエリの実行速度を効果的に制限できます。

完了したら、、、またはを呼び出すことCOMMITでカーソルを取り除くことができますROLLBACKCLOSE my_cursor

一部の種類のクエリは、カーソルを介して直接ストリーミングすることはできませんが、出力の最初の行を生成する前に完了するまで実行されることに注意してください。ハッシュ集計と大きなインデックスなしの並べ替えを使用したクエリがその一例です。設定(デフォルトは0.1)を下げてcursor_tuple_fraction、プランナーがこれらの種類のプランを選択しないようにすることができますが、常に可能であるとは限りません。

于 2011-03-19T17:53:04.620 に答える
4

カーソルを絞る唯一の方法は、作業を行ってからスリープすることです。

CREATE OR REPLACE FUNCTION test_cursor()
  RETURNS void AS
$BODY$

DECLARE
    curs1 CURSOR FOR SELECT select * from information_schema.tables limit 5;

BEGIN

    FOR example_variable IN curs1 LOOP
        -- Other pgsql statements

        -- sleep for one second
        perform pg_sleep(1);

    END LOOP;

END;
$BODY$
  LANGUAGE plpgsql;

pg_dumpのソースコードには、その「スロットル」アルゴリズムの擬似コードが含まれていますが、一定期間スリープするだけで十分です。

* If throttle is non-zero, then
*      See how long since the last sleep.
*      Work out how long to sleep (based on ratio).
*      If sleep is more than 100ms, then
*          sleep
*          reset timer
*      EndIf
* EndIf
于 2011-03-19T13:00:44.163 に答える