Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách tăng tốc độ chèn hàng loạt vào MS SQL Server bằng pyodbc

Như đã lưu ý trong một nhận xét cho một câu trả lời khác, T-SQL BULK INSERT lệnh sẽ chỉ hoạt động nếu tệp được nhập nằm trên cùng một máy với phiên bản SQL Server hoặc nằm trong vị trí mạng SMB / CIFS mà phiên bản SQL Server có thể đọc. Do đó, nó có thể không áp dụng được trong trường hợp tệp nguồn nằm trên máy khách từ xa.

pyodbc 4.0.19 đã thêm tính năng Cursor # fast_executemany có thể hữu ích trong trường hợp đó. fast_executemany được "tắt" theo mặc định và mã kiểm tra sau ...

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

... mất khoảng 22 giây để thực thi trên máy thử nghiệm của tôi. Chỉ cần thêm 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')

... đã giảm thời gian thực hiện xuống chỉ còn hơn 1 giây.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ký tự thoát trong SQL Server

  2. Nhận hàng trong đó cột datetime =hôm nay - Máy chủ SQL noob

  3. Cách giới hạn hàng trong bộ kết quả máy chủ SQL

  4. Trả về các tham số của một thủ tục được lưu trữ hoặc hàm do người dùng xác định trong SQL Server (ví dụ T-SQL)

  5. SQL Server, Làm thế nào để đặt tự động tăng sau khi tạo bảng mà không bị mất dữ liệu?