cx_Oracle:fetchall()停止使用大型SELECT语句

问题描述 投票:1回答:2

我正在尝试从oracle数据库读取数据。我必须在python上阅读返回100万行的简单选择的结果。

我使用fetchall()函数,更改了游标的arraysize属性。

select_qry = db_functions.read_sql_file('src/data/scripts/03_perimetro_select.sql')
dsn_tns = cx_Oracle.makedsn(ip, port, sid)
con = cx_Oracle.connect(user, pwd, dsn_tns)


start = time.time()

cur = con.cursor()
cur.arraysize = 1000
cur.execute('select * from bigtable where rownum < 10000')
res = cur.fetchall()
# print res  # uncomment to display the query results
elapsed = (time.time() - start)
print(elapsed, " seconds")
cur.close()
con.close()

如果我删除where条件where rownum < 10000,则python环境将冻结,并且fetchall()函数将永远不会结束。

经过一些试验,我发现了此精确选择的极限,它可以工作到50k行,但是如果我选择60k行,它将失败。

是什么引起了这个问题?我是否必须找到另一种方式来获取此数量的数据,或者问题是ODBC连接?如何测试?

我正在尝试从oracle数据库读取数据。我必须在python上阅读返回100万行的简单选择的结果。我使用fetchall()函数,更改了...

python oracle odbc cx-oracle fetchall
2个回答
1
投票

考虑使用Oracle的ROWNUM批量运行。要合并回单个对象,请追加到不断增加的列表中。下面假设表的总行数为1磨。根据需要进行调整:


2
投票

您可能正在运行cx_Oracle的计算机上的内存不足。不要使用fetchall(),因为这将要求cx_Oracle将所有结果保存在内存中。使用类似这样的方法来获取批记录:

© www.soinside.com 2019 - 2024. All rights reserved.