首页 > 解决方案 > 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 查询真的很慢,所以我把它分成几个查询:

  1. query1 获取 ID 和日期。
  2. 查询 2 使用查询 1 中的 ID 和日期并选择更多列(以最多 2 个 OR 语句分块)。
  3. query3 获取 query2 数据并将其插入 MSSQL。

标签: sql-serverpython-3.xsqlalchemybulkinsert

解决方案


推荐阅读