Tăng tốc độ INSERT


7

Tôi cần có cách chèn vào bảng, nhanh, đồng bộ, với thời lượng tối thiểu. Những gì tôi đã thử ("mù") là:

  • Không có chỉ số nào trên bàn
  • Chuyển sang ghi nhật ký đơn giản (từ ghi nhật ký đầy đủ)

Kịch bản thử nghiệm mà tôi sử dụng bao gồm 100 kết nối, mỗi kết nối chạy một INSERT và sau đó đợi 0,1 giây và sau đó một lần nữa, vô thời hạn. Mỗi "bộ lọc" ghi lại thời gian thực hiện.

Nhìn vào thời gian thực hiện đôi khi tôi thấy 1,5 và thậm chí 10 giây trên một chèn (như các trường hợp ngoại lệ), nếu không thì 0,2 giây thông thường là những gì tôi thấy.

Thêm bối cảnh:

  • SQL Server 2008 R2 Express (phiên bản express chỉ giới hạn kích thước DB (4GB), RAM (1GB) và CPU logic (1)
  • Máy: Laptop có ổ cứng 7200 RPM, RAM 8 GB và 8 CPU logic, lưu trữ máy chủ và máy khách
  • Bảng này bao gồm 1 BigInt ID (danh tính), trường NVARCHAR (100) và NVARCHAR (MAX) (INSERT trên này có tải trọng 10k) và cột NVARCHAR (MAX) (tải trọng 30k tại cột INSERT)

Tôi nên tìm những cải tiến nào nữa cho hiệu suất của quá trình như vậy?


Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White 9

Câu trả lời:


6

Rất nhiều người đã thêm rất nhiều điểm tốt trong các bình luận.

1) Tách nhật ký giao dịch của bạn vào một ổ đĩa khác. Điều đó sẽ trở nên khó khăn với một máy tính xách tay. Nếu bạn không thể làm điều đó, hãy kiếm cho mình một ổ SSD cho máy tính xách tay và điều đó sẽ giúp cuộc sống của bạn tốt hơn đáng kể.

2) Phát triển trước dữ liệu và tệp nhật ký của bạn đến số lượng mục tiêu. Nếu bạn muốn thêm 1GB dữ liệu vào cơ sở dữ liệu của mình, hãy tạo dữ liệu và tệp nhật ký của bạn ít nhất 1,5 GB để bắt đầu. Dữ liệu và tệp nhật ký tự động là những kẻ giết chết hiệu năng và rất có thể là lý do bạn thấy 10 "cuộn cảm" này trong hiệu suất. SQL Management Studio có một số báo cáo tích hợp (Tôi tin rằng bạn nhấp chuột phải vào DB, sau đó chọn Báo cáo -> Sử dụng đĩa) sẽ có một bảng gồm tất cả các sự kiện tự động phát hành của bạn ở đó.)

3) Nếu bạn có thể bó các phần chèn của mình trên cơ sở theo từng khách hàng, thì hãy sử dụng câu lệnh SqlBulkCopy hoặc BULK INSERT.

4) Không có lý do tại sao các bảng của bạn không nên có khóa chính được nhóm. SQL Server sẽ có thể xử lý một chỉ mục được nhóm trên cột IDENTITY của bạn theo cách khá hiệu quả.


1
Phân vùng có vẻ như quá mức cần thiết ở đây, và việc thiết kế và duy trì sẽ phức tạp hơn rất nhiều khi chỉ cần "đặt một phân vùng trên đó sẽ nhanh hơn"
JNK

1

Lời khuyên của tôi là ra khỏi máy tính xách tay. Đặt nó trên một máy thật, với ổ đĩa nhanh và nhiều ram.


Tôi chắc chắn điều đó sẽ giúp nhưng tôi đã thử nghiệm trên máy tính xách tay chỉ để xem mọi thứ sẽ bị nghẽn ở đâu và đâu là bước đầu tiên và dễ dàng nhất tôi có thể thực hiện để cải thiện mọi thứ, trước khi xem xét mở rộng.
Andrei Rînea

Vấn đề với cách tiếp cận của bạn là máy tính xách tay và máy chủ khác nhau về cơ bản so với quan điểm kiến ​​trúc bên trong.
datagod

... Và tôi không thể xác định các cách để tăng tốc thứ gì đó sẽ chạy trên máy chủ nếu tôi kiểm tra trên máy tính xách tay?
Andrei Rînea

1
Bạn có thể, nhưng bạn sẽ có thể lãng phí thời gian để cố gắng khắc phục các tắc nghẽn do chính máy tính xách tay giới thiệu. Nó giống như một vận động viên olympic yêu cầu mọi người nhận xét về hình thức của anh ấy, hỏi cách cải thiện thời gian của anh ấy trên đường đua, trong khi anh ấy đang mặc đồ lặn.
datagod

3
Nút cổ chai của bạn trên máy tính xách tay có lẽ rất khác (và có thể thay đổi!) So với một máy chủ phù hợp. Nếu bạn định kiểm tra căng thẳng thì ít nhất hãy chạy nó trên một thiết bị được thiết lập như một máy chủ không có gì khác đang chạy. Bạn có khả năng gặp phải tình trạng tắc nghẽn RAM / CPU trên máy tính xách tay có thể không tồn tại trên máy sản xuất
Ben Brocka
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.