5

这篇文章建议我可以使用游标以受限制的速率从查询中获取。我该怎么做呢?

我的目标是减少这个低优先级查询对其他高优先级查询的影响。

4

2 回答 2

6

DECLARE您可以通过使用以下命令声明服务器端游标来做到这一点:

DECLARE my_cursor CURSOR FOR select * from foo;

FETCH然后反复使用该命令读取其结果:

FETCH 10 FROM my_cursor;

通过在 FETCH 命令之间休眠,您可以有效地限制查询的执行速度。

完成后,您可以通过调用COMMITROLLBACKCLOSE my_cursor

请注意,某些类型的查询不能通过游标直接流式传输,但会在它们产生第一行输出之前运行完成。具有散列聚合和大型非索引排序的查询就是一个示例。您可以降低cursor_tuple_fraction设置(默认 0.1)以阻止计划者选择这些类型的计划,但这并不总是可行的。

于 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 回答