sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man snabbar på massinsättning till MS SQL Server med pyodbc

Som noterats i en kommentar till ett annat svar, T-SQL BULK INSERT kommandot fungerar bara om filen som ska importeras finns på samma maskin som SQL Server-instansen eller är på en SMB/CIFS-nätverksplats som SQL Server-instansen kan läsa. Därför kanske det inte är tillämpligt i de fall där källfilen finns på en fjärrklient.

pyodbc 4.0.19 lade till en Cursor#fast_executemany-funktion som kan vara till hjälp i så fall. fast_executemany är "av" som standard, och följande testkod ...

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

... tog ungefär 22 sekunder att köra på min testmaskin. Lägg bara till 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')

... minskade exekveringstiden till drygt 1 sekund.



  1. MySQL och JDBC med rewriteBatchedStatements=true

  2. Vad är en genererad kolumn?

  3. SQLite Order By

  4. Skriptet för MySQL-replikeringshälsokontroll