python - 使用 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 行表中获取数据变得更加困难和滞后。
这有可能加快进程吗?我想对查询进行分区并对其进行迭代。但我想不出如何拆分查询
解决方案
您是否查看过适用于 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
查看数据库模式:查看索引、“附加”提示等。
推荐阅读
- spring-mvc - javax.servlet.jsp.JspTagException:Bean 名称“用户”的 BindingResult 和普通目标对象都不能用作请求属性
- javascript - 为什么“渲染”不会用更新的状态重新渲染 UI?
- java - 如何找到涉及对数和求和规则的嵌套 for 循环的时间复杂度?
- r - 有没有办法解决make rstan的错误
- javascript - 在 Google 表格中按状态自动发送电子邮件
- firebase - 如何获取作为 Future 的 Firestore.instance.collection()
? - pytest - PyTest-BDD : 支持没有场景大纲的数据表
- javascript - 是否可以使用 Web NFC API 对 NFC 标签进行写保护?
- android - 如何以编程方式将英文文本翻译成日文文本?
- delphi - 如何在函数中添加查询