Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment accélérer l'insertion en bloc dans MS SQL Server à l'aide de pyodbc

Comme indiqué dans un commentaire à une autre réponse, le T-SQL BULK INSERT La commande ne fonctionnera que si le fichier à importer se trouve sur la même machine que l'instance SQL Server ou se trouve dans un emplacement réseau SMB/CIFS que l'instance SQL Server peut lire. Ainsi, il peut ne pas être applicable dans le cas où le fichier source se trouve sur un client distant.

pyodbc 4.0.19 a ajouté une fonctionnalité Cursor#fast_executemany qui peut être utile dans ce cas. fast_executemany est "off" par défaut, et le code de test suivant ...

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')

... a pris environ 22 secondes pour s'exécuter sur ma machine de test. Ajouter simplement 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')

... a réduit le temps d'exécution à un peu plus d'une seconde.