Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como acelerar a inserção em massa no MS SQL Server usando pyodbc


Conforme observado em um comentário para outra resposta, o T-SQL BULK INSERT O comando só funcionará se o arquivo a ser importado estiver na mesma máquina que a instância do SQL Server ou estiver em um local de rede SMB/CIFS que a instância do SQL Server possa ler. Assim, pode não ser aplicável no caso de o arquivo de origem estar em um cliente remoto.

pyodbc 4.0.19 adicionou um recurso Cursor#fast_executemany que pode ser útil nesse caso. fast_executemany está "desligado" por padrão, e o seguinte código de teste ...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")

sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')

... levou aproximadamente 22 segundos para ser executado na minha máquina de teste. Basta adicionar crsr.fast_executemany = True ...
cnxn = pyodbc.connect(conn_str, autocommit=True)
crsr = cnxn.cursor()
crsr.execute("TRUNCATE TABLE fast_executemany_test")

crsr.fast_executemany = True  # new in pyodbc 4.0.19

sql = "INSERT INTO fast_executemany_test (txtcol) VALUES (?)"
params = [(f'txt{i:06d}',) for i in range(1000)]
t0 = time.time()
crsr.executemany(sql, params)
print(f'{time.time() - t0:.1f} seconds')

... reduziu o tempo de execução para pouco mais de 1 segundo.