sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan fremskyndes masseindsættelse til MS SQL Server ved hjælp af pyodbc

Som nævnt i en kommentar til et andet svar, T-SQL BULK INSERT kommandoen fungerer kun, hvis filen, der skal importeres, er på den samme maskine som SQL Server-forekomsten eller er på en SMB/CIFS-netværksplacering, som SQL Server-forekomsten kan læse. Derfor er den muligvis ikke anvendelig i det tilfælde, hvor kildefilen er på en fjernklient.

pyodbc 4.0.19 tilføjede en Cursor#fast_executemany-funktion, som kan være nyttig i det tilfælde. fast_executemany er "off" som standard, og følgende testkode ...

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 cirka 22 sekunder at udføre på min testmaskine. Du skal blot tilføje 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')

... reducerede udførelsestiden til lidt over 1 sekund.



  1. Opret et Multi-Step SQL Server Agent Job (T-SQL)

  2. Sådan undslipper du enkelt citat, specielle tegn i MySQL

  3. Hvordan indsætter/opdaterer man større datastørrelser i Oracle-tabellerne?

  4. SQL Developer-scriptoutput afkorter sys_refcursor-bredden