sql >> Database >  >> RDS >> Sqlserver

Bulkinsert naar MS SQL Server versnellen met pyodbc

Zoals opgemerkt in een opmerking bij een ander antwoord, is de T-SQL BULK INSERT opdracht werkt alleen als het te importeren bestand zich op dezelfde computer bevindt als de SQL Server-instantie of zich op een SMB/CIFS-netwerklocatie bevindt die de SQL Server-instantie kan lezen. Het is dus mogelijk niet van toepassing in het geval dat het bronbestand zich op een externe client bevindt.

pyodbc 4.0.19 heeft een Cursor#fast_executemany-functie toegevoegd die in dat geval nuttig kan zijn. fast_executemany is standaard "uit" en de volgende 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')

... duurde ongeveer 22 seconden om uit te voeren op mijn testmachine. Gewoon crsr.fast_executemany = True . toevoegen ...

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

... de uitvoeringstijd teruggebracht tot iets meer dan 1 seconde.



  1. Hoe krijg ik datum-/tijdgegevens uit een TIMESTAMP-kolom?

  2. Hoe ORA-29280 op te lossen:ongeldig mappad

  3. Oracle SQL Developer 21.4.2 en SQLcl 21.4.1 zijn nu beschikbaar

  4. Verborgen functie:slepen en neerzetten van toegang tot objecten tussen bestanden