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

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???

解决方法

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

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


回答:

用服务器端游标:

with conn.cursor(name='server_cursor') as cursor:

cursor.itersize = 10000 # 设置你要的批量大小

cursor.execute(sql)

for record in cursor:

# 处理记录


回答:

你做了类似这步操作cursor = conn.cursor()还是会出现这个问题?

以上是 psycopg2处理大数据量SQL在execute(sql)卡死? 的全部内容, 来源链接: utcz.com/p/939056.html

回到顶部