Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przyspieszyć wstawianie zbiorcze do MS SQL Server za pomocą pyodbc?

Jak zauważono w komentarzu do innej odpowiedzi, T-SQL BULK INSERT Polecenie będzie działać tylko wtedy, gdy plik do zaimportowania znajduje się na tym samym komputerze, co instancja SQL Server lub znajduje się w lokalizacji sieciowej SMB/CIFS, którą może odczytać instancja SQL Server. Dlatego może nie mieć zastosowania w przypadku, gdy plik źródłowy znajduje się na zdalnym kliencie.

pyodbc 4.0.19 dodał funkcję Cursor#fast_executemany, która może być pomocna w tym przypadku. fast_executemany jest domyślnie wyłączone, a następujący kod testowy...

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

... wykonanie na mojej maszynie testowej zajęło około 22 sekund. Po prostu dodając 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')

... skrócił czas wykonania do nieco ponad 1 sekundy.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dlaczego nie ma funkcji okienkowych w klauzulach where?

  2. Wygeneruj zestaw wyników inkrementacji dat w TSQL

  3. Wspólne wyrażenie tabeli, dlaczego średnik?

  4. Znajdź znaki spoza zestawu ASCII w kolumnach varchar za pomocą SQL Server

  5. Jak ustawić poniedziałek jako pierwszy dzień tygodnia w SQL Server