Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beschleunigen Sie die Masseneinfügung in MS SQL Server mit pyodbc

Wie in einem Kommentar zu einer anderen Antwort erwähnt, der T-SQL BULK INSERT Der Befehl funktioniert nur, wenn sich die zu importierende Datei auf demselben Computer wie die SQL Server-Instanz oder an einem SMB/CIFS-Netzwerkspeicherort befindet, den die SQL Server-Instanz lesen kann. Daher ist es möglicherweise nicht anwendbar, wenn sich die Quelldatei auf einem Remote-Client befindet.

pyodbc 4.0.19 hat eine Cursor#fast_executemany-Funktion hinzugefügt, die in diesem Fall hilfreich sein kann. fast_executemany ist standardmäßig "off", und der folgende Testcode ...

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

... dauerte ungefähr 22 Sekunden, um auf meiner Testmaschine ausgeführt zu werden. Einfach crsr.fast_executemany = True hinzufügen ...

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

... reduzierte die Ausführungszeit auf knapp über 1 Sekunde.