cách nhanh nhất để làm điều này là gì:Cách nhanh nhất để chèn vào bảng SQL Server từ mã .NET?
- Một bảng, không có tài liệu tham khảo mà tôi không thể điền trước (tức là có một chìa khóa tham khảo ở đó, nhưng tôi có tất cả các dữ liệu điền vào)
- LOTS dữ liệu . Chúng tôi nói về hàng trăm triệu hàng mỗi ngày, đến bằng động qua API
- Yêu cầu phải/được xử lý ngay khi có thể trong kịch bản gần thời gian thực (tức là không viết lên tệp để tải lên một tệp mỗi ngày) . 2 giây là sự chậm trễ tối đa bình thường
- máy riêng biệt cho dữ liệu/ứng dụng và SQL Server
Những gì tôi làm bây giờ:
- tổng hợp lên đến 32 * 1024 hàng vào một mảng, sau đó xếp hàng nó.
- Đọc hàng đợi trong 2-3 chủ đề. Chèn vào cơ sở dữ liệu bằng SqlBulkCopy.
Tôi nhận được khoảng 60k-75k hàng được nhập mỗi giây, không đủ nhưng khá gần. Tôi rất thích đánh 250.000 hàng.
Hiện tại, không có gì thực sự được sử dụng. Tôi nhận được 20% thời gian "mạng I/O" khối, có một lõi 80% nạp CPU bên. Đĩa được viết ra 7mb-14mb, chủ yếu là nhàn rỗi. Độ dài hàng đợi trung bình trên RAID 10 của 6 raptors là .... 0.25.
Bất kỳ ai cũng có ý tưởng làm thế nào để tăng tốc độ này? Nhanh hơn máy chủ (cho đến nay nó là ảo, 8gb ram, 4 lõi, vật lý đĩa đi qua cho dữ liệu).
Thêm một số giải thích:
- Đây là một R2 Enterprise SQL Server 2008 trên một máy chủ 2008 R2. máy có 4 lõi, 8gb ram. Tất cả 64 bit. 80% tải trung bình đến từ máy này cho thấy khoảng 20% tải CPU.
- Bảng đơn giản, không có khóa chính, chỉ là chỉ mục trên tham chiếu quan hệ (tham chiếu công cụ) và dấu thời gian (trong bộ công cụ, vì vậy đây không phải là bắt buộc).
- Các trường trên bảng là: dấu thời gian, tham chiếu công cụ (không có khóa ngoại lệ bắt buộc), kiểu dữ liệu (char 1, một trong số ký tự cho biết dữ liệu nào được đăng), giá (tăng gấp đôi) và âm lượng (int). Như bạn có thể thấy đây là một bảng RẤT mỏng. Dữ liệu được đề cập là dữ liệu đánh dấu cho các công cụ tài chính.
- Câu hỏi cũng là về phần cứng, v.v. - chủ yếu là vì tôi không thấy nút cổ chai thực sự. Tôi đang chèn vào nhiều giao dịch và nó mang lại cho tôi một lợi ích, nhưng một lợi ích nhỏ. Đĩa, CPU không hiển thị tải trọng đáng kể, mạng io chờ đợi cao (300ms/giây, 30% tại thời điểm này), nhưng điều này là trên cùng một nền tảng ảo hóa chạy JSUT hai máy chủ và có đủ lõi để chạy tất cả. Tôi khá nhiều đang mở để "mua một máy chủ", nhưng tôi muốn xác định nút cổ chai đầu tiên .... đặc biệt là cho rằng vào cuối ngày tôi không nắm lấy những gì nút cổ chai là. Ghi nhật ký không liên quan - chèn hàng loạt KHÔNG đi vào nhật ký dữ liệu dưới dạng dữ liệu (không có chỉ số nhóm).
Trợ giúp phân vùng theo chiều dọc, ví dụ: một byte (nhỏ xíu) có thể chia vũ trụ công cụ cho ví dụ 16 bảng và do đó tôi thực hiện tối đa 16 lần chèn cùng một lúc?Như thực tế dữ liệu đến từ các sàn giao dịch khác nhau, tôi có thể tạo một phân vùng cho mỗi trao đổi. Đây sẽ là một lĩnh vực phân chia tự nhiên (thực ra là trong nhạc cụ, nhưng tôi có thể sao chép dữ liệu này ở đây).
Một số giải thích rõ hơn: Tốc độ thậm chí còn cao hơn (90k), hiện bị hạn chế rõ ràng bởi IO mạng giữa các máy, có thể là chuyển mạch VM.
Điều tôi làm bây giờ là kết nối trên mỗi hàng 32k, đặt bảng tạm thời, chèn vào với SqlBUlkdCopy, THEN sử dụng câu lệnh ONE sql để sao chép vào bảng chính - giảm thiểu bất kỳ thời gian khóa nào trên bảng chính.
Hầu hết thời gian chờ đợi hiện vẫn đang trên mạng IO. Dường như tôi chạy vào các vấn đề mà VM khôn ngoan. Sẽ chuyển sang phần cứng vật lý trong những tháng tới;)
Địa ngục, bạn có chắc chắn lưu trữ dữ liệu trong DB quan hệ là giải pháp bạn thực sự cần? Bạn không thể lưu trữ dữ liệu lúc đầu trong một số loại tệp nhật ký và khi bạn sẽ phân tích dữ liệu, hãy chạy một số loại quy trình tổng hợp để nó chỉ trích xuất thông tin có liên quan đến cơ sở dữ liệu của bạn? –
Có, nhưng tôi rất thích không. Có rất nhiều thứ đang diễn ra ở đây, và nó cũng là một ví dụ lập trình tốt. Ngoài ra, khi extracing các bản ghi để sử dụng hoạt động tôi có thể phải thực hiện 1-2 tỷ hàng càng sớm càng tốt từ định dạng nhị phân nén vào dữ liệu quan hệ. Chỉ cần buộc để có được các giới hạn ở đây. – TomTom
Điều này đặc biệt đúng bởi vì cuối cùng tôi không thực sự thấy lý do tại sao nó không chèn nhanh hơn. Ngay cả một lõi không được sử dụng hết, đĩa không, và tôi có mạng I/O như điều kiện chờ đợi. Tôi không chuyển nhiều dữ liệu. Đây là một điều nhỏ để tôi suy nghĩ về ...;) và sửa chữa. – TomTom