首页 > 解决方案 > 使用 Python 优化从 Postgres 到 Oracle 数据库的迁移

问题描述

我需要将数据从 Postgres 导入 Oracle。我正在尝试使用 psycopg2、pandas、cx_Oracle 对 python 进行此操作。首先我正在导入数据:

sql = '''select * from test'''
conn = psycopg2.connect(dbname='db',user='usr',password='pswd',host='...')
df = pd.read_sql_query(sql,conn)
conn.close()

然后我尝试将其导入到 oracle:

dsn = """(DESCRIPTION=(LOAD_BALANCE=ON)(FAILOVER=ON)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521))
                                            (ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521))
                                            (ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521)))
             (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=test)))"""
usr = "usr"
pswd = "user"

engine = create_engine('oracle+cx_oracle://%s:%s@%s' % (usr, pswd, dsn))
conn = engine.connect()
conn.execute("TRUNCATE TABLE test_or")

df.to_sql(name = 'test_or', con = engine, schema = 'sch', index = False, if_exists='append')

它适用于 3,000,000 行表,但从 70,000,000 行表中获取数据变得更加困难和滞后。

这有可能加快进程吗?我想对查询进行分区并对其进行迭代。但我想不出如何拆分查询

标签: pythonpostgresqloraclepsycopg2cx-oracle

解决方案


您是否查看过适用于 ODBC 的 Oracle 数据库网关?还可以查看 Oracle GoldenGate。

另一种解决方案是将数据文件转储到磁盘上,然后使用 SQL*Loader 或 External Tables 加载它,请参阅Oracle 中 10 分钟内 1000 万次查询的 INSERT?这个博客

如果您继续使用 Python,并且由于性能很重要,那么直接使用本机驱动程序而不是 Pandas(这增加了数据必须经过的另一层)。查看 cx_Oracle doc批处理语句执行和批量加载。您可以决定自己的分区方法来一次处理多批行。另一个例子是https://github.com/oracle/python-cx_Oracle/issues/548#issuecomment-816007567

查看数据库模式:查看索引、“附加”提示等。


推荐阅读