SQL Commands: DECLARE
:
在当前的实现中,由保留的光标表示的行。
被复制到一个临时文件或内存区域,以便它们保持
可用于后续交易。
这取决于您是从单个事务使用光标,还是使用“保留”和多个事务。
如果使用“WITHHOLD”,那么在调用“DECLARE”的事务的“COMMIT”上,将使用来自光标的所有数据创建一个临时表。如果数据大小较大,则将表保存到磁盘,因此提取速度可能会稍慢一些。但不要太慢,因为这应该是对一些合理行数的连续扫描。
tometzky=> begin;
BEGIN
Time: 0.301 ms
tometzky=> declare c no scroll cursor with hold for select pg_sleep(1) from generate_series(1,6);
DECLARE CURSOR
Time: 1.140 ms
tometzky=> commit;
COMMIT
Time: 6007.180 ms (00:06.007)
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(3 rows)
Time: 0.384 ms
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(3 rows)
Time: 0.336 ms
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(0 rows)
Time: 0.338 ms
当您使用调用declare的同一事务中的光标时,一旦请求的行数可用,每个提取都将返回:
tometzky=> begin;
BEGIN
Time: 0.301 ms
tometzky=> declare c no scroll cursor for select pg_sleep(1) from generate_series(1,6);
DECLARE CURSOR
Time: 1.225 ms
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(3 rows)
Time: 3004.041 ms (00:03.004)
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(3 rows)
Time: 3003.855 ms (00:03.004)
tometzky=> fetch forward 3 from c;
pg_sleep
----------
(0 rows)
Time: 0.229 ms
tometzky=> commit;
COMMIT
Time: 0.444 ms
但是,例如,如果您使用的查询最后一步需要排序,那么无论如何,它必须先获取所有行才能对它们进行排序。