sql-server - SQLAlchemy MSSQL 批量插入,效率问题
问题描述
我需要将 3600 万行从 Oracle 插入到 MSSQL。下面的代码有效,但即使分块为 1k(因为在 MSSQL 中一次只能插入 1k 行),它一点也不快。目前估计这需要大约 100 个小时,这不会减少它:)
def method(self):
# get IDs and Dates from Oracle
ids_and_dates = self.get_ids_and_dates()
# get 2 each time
for chunk in chunks(ids_and_dates, 2):
# set up list for storing each where clause
where_clauses = []
for id, last_change_dt in chunk:
where_clauses.append(self.queries['where'] % {dict})
# set up final SELECT statement
details_query = self.queries['details'] % " OR ".join([wc for wc in where_clauses])
details_rows = [str(r).replace("None", "null") for r in self.src_adapter.fetchall(details_query)]
for tup in chunks(details_rows, 1000):
# tup in the form of ["(VALUES_QUERY)"], remove []""
insert_query = self.queries['insert'] % ', '.join(c for c in tup if c not in '[]{}""')
self.dest_adapter.execute(insert_query)
fetchall
从我一直在阅读的内容中,我意识到这并不理想。我应该考虑实施其他东西吗?我应该尝试executemany
而不是使用execute
插入?
独立的 Oracle 查询真的很慢,所以我把它分成几个查询:
- query1 获取 ID 和日期。
- 查询 2 使用查询 1 中的 ID 和日期并选择更多列(以最多 2 个 OR 语句分块)。
- query3 获取 query2 数据并将其插入 MSSQL。
解决方案
推荐阅读
- node.js - NodeJS 错误:内部/模块/cjs/loader.js:905-找不到模块“./config”
- python - 从 YouTube 下载视频:HTTPError:HTTP 错误 404:未找到
- c# - 我正在尝试在没有拆分功能的情况下拆分字符串,但我的代码无法正常工作
- reactjs - 如何从映射对象中获取密钥
- python - 在同一类中的方法中调用变量
- flutter - 添加子列小部件时如何保持容器小部件宽度
- java - 无法使用接口传入位置Recyclerview
- html - ChartJS“半甜甜圈”图表无法正确显示
- web-scraping - Scrapy xpath-selector 不适用于此 html 标签
- python - 制作一个装饰器,可以访问在python中作为输入的函数的参数