如何减少PostgreSQL中长时间运行的i / o密集型查询的影响?

时间:2011-03-19 11:14:00

标签: postgresql cursor throttling

This post建议我可以使用游标以限制速率从查询中获取。我该怎么做呢?我的目标是减少这种低优先级查询对其他优先级较高的查询的影响。

2 个答案:

答案 0 :(得分:4)

您可以使用DECLARE命令声明服务器端游标来执行此操作:

DECLARE my_cursor CURSOR FOR select * from foo;

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

FETCH 10 FROM my_cursor;

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

完成后,您可以拨打COMMITROLLBACKCLOSE my_cursor

来摆脱光标

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

答案 1 :(得分:3)

我知道限制光标的唯一方法是做一些工作,然后睡觉。

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