这篇文章建议我可以使用游标以受限制的速率从查询中获取。我该怎么做呢?
我的目标是减少这个低优先级查询对其他高优先级查询的影响。
这篇文章建议我可以使用游标以受限制的速率从查询中获取。我该怎么做呢?
我的目标是减少这个低优先级查询对其他高优先级查询的影响。
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)以阻止计划者选择这些类型的计划,但这并不总是可行的。
我知道限制光标的唯一方法是做一些工作,然后睡觉。
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