psycopg2处理大数据量SQL在execute(sql)卡死?

作者站长头像
站长
· 阅读数 8

题目描述

sql='select * from A',A表有8百万数据

前段时间写了数据库互相导数据的Python脚本,是Oracle导入postgreSQL,使用cx_Oracle执行execute(sql)没有任何问题。这次是postgreSQL导入postgreSQL,使用psycopg2执行execute(sql)就直接卡死在这一行了,并且内存占用持续上升。

自己的思路

数据库连接是没有问题的,因为其他少数据量表可以正常执行,A表的SQL写分页也可以正常执行。我也清楚可以通过多次分页实现避免这个bug,但是我想咨询下各位大佬为什么会出现这个问题?按道理来说execute(sql)这里是不会查询数据的,后面应该是通过方法或者循环游标获取数据,但它就是在这里卡住了,持续攀升的内存让我认为它在这里就执行了sql,并且想把这8百万数据加载入内存!这个问题是怎么导致的啊?或者说是psycopg2库的bug???

解决方法

看到下面大佬的回答,我搜索了下服务端游标,最后做出总结:

  1. 客户端和服务端游标的区别:客户端会把结果全部加载进内存,服务端只会获取一个指针
  2. Oracle默认使用的是服务端游标,这就是为什么cx_Oracle没问题的原因!
  3. psycopg2默认客户端游标,开启服务端游标的方法是cursor(name='server_cursor')
回复
1个回答
avatar
test
2024-06-25

用服务器端游标:

with conn.cursor(name='server_cursor') as cursor:
    cursor.itersize = 10000  # 设置你要的批量大小
    cursor.execute(sql)
    for record in cursor:
        # 处理记录
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容