sql >> Databáze >  >> RDS >> Sqlserver

Jak zrychlit hromadné vkládání na MS SQL Server pomocí pyodbc

Jak je uvedeno v komentáři k jiné odpovědi, T-SQL BULK INSERT příkaz bude fungovat pouze v případě, že soubor, který má být importován, je na stejném počítači jako instance SQL Server nebo je v síťovém umístění SMB/CIFS, které může instance SQL Serveru číst. Nemusí to být tedy použitelné v případě, kdy je zdrojový soubor na vzdáleném klientovi.

pyodbc 4.0.19 přidal funkci Cursor#fast_executemany, která může být v takovém případě užitečná. fast_executemany je ve výchozím nastavení "vypnuto" a následující testovací kód ...

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

... trvalo přibližně 22 sekund provedení na mém testovacím počítači. Stačí přidat 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')

... zkrátil dobu provádění na něco málo přes 1 sekundu.



  1. Výpočet průběžného součtu pomocí klauzule OVER a klauzule PARTITION BY na serveru SQL Server

  2. mysql_insert_id alternativa pro postgresql

  3. OMEZENÍ SQL

  4. Přednášky:Vylepšení dělení v PostgreSQL 11