python – 带有postgres的游标,存储数据的位置以及对DB的调用次数

嗨,我使用psycopg2进行postgres访问.我试图了解“游标”存储返回行的位置.它是作为临时表存储在数据库中还是存储在客户端?游标(当你指定获取多行时)一次向数据库命中一次查询或者它是否一次命中数据库,得到第一组结果然后当你迭代返回的值时,它得到下一组(缓

嗨,我使用psycopg2进行postgres访问.

我试图了解“游标”存储返回行的位置.它是作为临时表存储在数据库中还是存储在客户端?

游标(当你指定获取多行时)一次向数据库命中一次查询或者它是否一次命中数据库,得到第一组结果然后当你迭代返回的值时,它得到下一组(缓冲) .

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

谢谢.

最佳答案
游标的数据集由服务器在执行第一个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(*)大致与创建类似临时表的时间大致相同:

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

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

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部