使用 Python 和 Pandas 从 Oracle 获取数据的性能问题
Performance issue getting data from Oracle using Python and Pandas
我正在使用 cx_Oracle
模块创建一个 sqlalchemy
引擎并使用 Python 和 Pandas 从 Oracle 数据库检索数据,但我有一个问题与性能有关,但我遇到了数据库错误。
如果我只指定几列,我的代码工作正常(但很慢),并且在很长一段时间后我可以获得所有 350 万行。这是我正在使用的代码:
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 不是唯一可用的方法,但它绝对是最方便的...有没有 better/safer 方法来获取这些来自 Oracle 数据库的数据?我正在考虑逐块下载行,将它们转储到可以传递给 Pandas 的 dict 列表中,但这看起来不是很“优雅”......我确定必须有一个更好的方法...:-)
提前感谢任何可以帮助我的人! :-)
JF
编辑 1:
回应@OldProgrammer 和@crocarneiro:
根据查询结果,没有到列的索引select * from all_ind_columns where table_name = 'TABLE_BEN_L_T';
编辑 2:
这是我收到的错误消息:
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 Jones!这看起来很有趣!
我终于按照 Christopher Jones 的建议调整 fetcharraysize
和 prefetchrows
属性解决了这个问题。
我通过设置属性值显着提高了性能,不再出现超时和错误消息!
非常感谢所有帮助过的人! :-)
JF
我正在使用 cx_Oracle
模块创建一个 sqlalchemy
引擎并使用 Python 和 Pandas 从 Oracle 数据库检索数据,但我有一个问题与性能有关,但我遇到了数据库错误。
如果我只指定几列,我的代码工作正常(但很慢),并且在很长一段时间后我可以获得所有 350 万行。这是我正在使用的代码:
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 不是唯一可用的方法,但它绝对是最方便的...有没有 better/safer 方法来获取这些来自 Oracle 数据库的数据?我正在考虑逐块下载行,将它们转储到可以传递给 Pandas 的 dict 列表中,但这看起来不是很“优雅”......我确定必须有一个更好的方法...:-)
提前感谢任何可以帮助我的人! :-)
JF
编辑 1: 回应@OldProgrammer 和@crocarneiro:
根据查询结果,没有到列的索引select * from all_ind_columns where table_name = 'TABLE_BEN_L_T';
编辑 2: 这是我收到的错误消息:
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 Jones!这看起来很有趣!
我终于按照 Christopher Jones 的建议调整 fetcharraysize
和 prefetchrows
属性解决了这个问题。
我通过设置属性值显着提高了性能,不再出现超时和错误消息!
非常感谢所有帮助过的人! :-)
JF