您好,我正在使用 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
某些驱动程序可能在客户端有自己的光标实现。这应该在驱动程序文档中明确描述。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)