带有 postgres 的游标,数据存储在哪里以及对数据库的调用次数

Cursors with postgres, where is the data stored and how many calls to the DB

您好,我正在使用 psycopg2 访问 postgres。

我试图了解 "cursor" 在哪里存储返回的行。它是作为临时存储在数据库中 table 还是在客户端?

游标(当您指定获取多行时)是一次访问数据库一个查询,还是一次访问数据库,获取第一组结果,然后当您迭代返回值时,它获取下一组(缓冲)。

我已经阅读了多篇关于游标的文章,但没有真正给出内部工作...

谢谢。

游标的数据集由服务器在执行第一个 FETCH 时准备。客户端应用程序仅接收后续 FETCH 语句的结果。

如果服务器无法使用索引来维护游标,则会创建临时数据集。您可以执行这个简单的测试:

create table test(i int, v text);
insert into test
select i, i::text
from generate_series(1, 5000000) i;

一条一条地执行这个脚本中的语句:

begin;

declare cur cursor 
for select * from test
order by random();             -- 17 ms

fetch next cur;                -- 37294 ms (*)

fetch next cur;                -- 0 ms
fetch prior cur;               -- 0 ms
fetch absolute 1000000 cur;    -- 181 ms
fetch relative 1000000 cur;    -- 163 ms
fetch first cur;               -- 0 ms
fetch last cur;                -- 0 ms

rollback;

第一个 FETCH (*) 的执行时间与创建类似临时文件的时间大致相同 table:

create temp table temp_test as
select * from test
order by random();             -- 51684 ms

一些驱动程序可能在客户端有自己的游标实现。这应该在驱动程序的文档中明确描述。