This post建议我可以使用游标以限制速率从查询中获取。我该怎么做呢?我的目标是减少这种低优先级查询对其他优先级较高的查询的影响。
答案 0 :(得分:4)
您可以使用DECLARE
命令声明服务器端游标来执行此操作:
DECLARE my_cursor CURSOR FOR select * from foo;
然后重复使用FETCH
命令读取其结果:
FETCH 10 FROM my_cursor;
通过在FETCH命令之间休眠,您可以有效地限制查询执行的速度。
完成后,您可以拨打COMMIT
,ROLLBACK
或CLOSE 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