Массовые вставки SQLAlchemy MSSQL, проблема с эффективностью - PullRequest
0 голосов
/ 01 марта 2019

Мне нужно вставить 36 миллионов строк из Oracle в MSSQL.Приведенный ниже код работает, но даже с разбивкой на 1k (поскольку вы можете вставлять только 1k строк за раз в MSSQL), это совсем не быстро.Текущие оценки предполагают, что это займет около 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 получает идентификаторы и даты.
  2. query 2 использует идентификаторы и даты из query1 и выбирает больше столбцов (разбито на максимум 2 оператора OR).
  3. query3 берет данные query2 и вставляет их в MSSQL.
...