psycopg2处理大数据量SQL在execute(sql)卡死?
题目描述
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???
解决方法
看到下面大佬的回答,我搜索了下服务端游标,最后做出总结:
- 客户端和服务端游标的区别:客户端会把结果全部加载进内存,服务端只会获取一个指针
- Oracle默认使用的是服务端游标,这就是为什么cx_Oracle没问题的原因!
- psycopg2默认客户端游标,开启服务端游标的方法是
cursor(name='server_cursor')
回复
1个回答
test
2024-06-25
用服务器端游标:
with conn.cursor(name='server_cursor') as cursor:
cursor.itersize = 10000 # 设置你要的批量大小
cursor.execute(sql)
for record in cursor:
# 处理记录
回复
适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容