首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Python和Pandas从Oracle获取数据的性能问题

使用Python和Pandas从Oracle获取数据的性能问题
EN

Stack Overflow用户
提问于 2021-05-31 17:29:51
回答 1查看 785关注 0票数 2

我正在使用cx_Oracle模块创建一个sqlalchemy引擎,并使用Pandas从sqlalchemy数据库中检索数据,但是性能方面存在问题,而且我正在获取数据库错误。

如果我只指定几个列,那么我的代码工作正常(但很慢),很长一段时间后,我可以得到所有的350万行。下面是我使用的代码:

代码语言:javascript
运行
复制
import cx_Oracle
import pandas as pd
import config
from sqlalchemy import create_engine

engine = create_engine('oracle+cx_oracle://config.user:config.password@config.host:1521/?service_name=config.service')

sql = "select ITEM_NO, COUNTRY_CODE, LANGUAGE_CODE from table_ben_l_t where (LANGUAGE_CODE = 'es' and COUNTRY_CODE = 'ES')"

df = pd.read_sql(sql, engine)

一旦我添加了更多的列,我就不能再运行它了,因为经过很长时间的延迟(我说的是几个小时),我得到了一个数据库错误。

我知道使用这种方法检索数据和创建Pandas并不是唯一可用的方法,但是它绝对是最方便的.是否有更好/更安全的方法从Oracle DB获取这些数据?我想把这些行一片片地下载下来,把它们放到一个可以传递给Pandas的数据列表中,但是这看起来并不是很“优雅”.我相信一定有更好的方法.:-)

预先感谢任何能帮助我的人!

JF

编辑1:响应@OldProgrammer和@crocarneiro:

根据查询select * from all_ind_columns where table_name = 'TABLE_BEN_L_T';的结果,没有对列的索引

编辑2: --这是我收到的错误消息:

代码语言:javascript
运行
复制
DatabaseError: (cx_Oracle.DatabaseError) ORA-01555: snapshot too old: rollback segment number 509 with name "_SYSSMU509_3146905099$" too small
(Background on this error at: http://sqlalche.me/e/14/4xp6)

非常感谢@Christopher !这看起来很有趣!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-03 15:49:17

最后,我按照Christopher的建议,通过调优fetcharraysizeprefetchrows属性来解决这个问题。

我通过设置属性值显着地提高了性能,并且不再有超时和错误消息!

非常感谢所有帮助你的人!

JF

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67778106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档