7

Tôi có một ứng dụng xanh trên đám mây với cơ sở dữ liệu Azure xanh. Tôi có vai trò công nhân cần phân tích cú pháp + xử lý trên một tệp (tối đa ~ 30 triệu hàng) nên tôi không thể trực tiếp sử dụng BCP hoặc SSIS.Chèn hàng loạt song song với SqlBulkCopy và Azure

Tôi hiện đang sử dụng SqlBulkCopy, tuy nhiên điều này có vẻ quá chậm vì tôi đã nhìn thấy thời gian tải lên đến 4-5 phút cho 400 nghìn hàng.

Tôi muốn chạy chèn hàng loạt song song; tuy nhiên đọc qua các bài viết về nhập dữ liệu trong hành vi khóa song song/kiểm soát, nó nói rằng SqlBulkCopy yêu cầu rằng bảng không có các chỉ mục nhóm và một tablelock (khóa BU) cần phải được chỉ định. Tuy nhiên các bảng màu xanh phải có chỉ số nhóm ...

Có thể sử dụng SqlBulkCopy song song trên cùng một bảng trong SQL Azure không? Nếu không có một API (mà tôi có thể sử dụng trong mã) để làm điều này?

Trả lời

4

Tôi không thấy cách bạn có thể chạy nhanh hơn bằng SqlBulkCopy. Trong dự án của chúng tôi, chúng tôi có thể nhập 250 nghìn hàng trong khoảng 3 phút, vì vậy tỷ lệ của bạn có vẻ đúng.

Tôi không nghĩ rằng làm điều đó song song sẽ giúp ích, ngay cả khi nó là kỹ thuật có thể. Chúng tôi chỉ chạy 1 lần nhập một lúc nếu không thì SQL Azure bắt đầu định thời gian cho các yêu cầu của chúng tôi.

Trong thực tế đôi khi, chạy một truy vấn theo nhóm lớn cùng một lúc khi không thể nhập. SQL Azure thực hiện rất nhiều công việc để đảm bảo chất lượng dịch vụ, điều này bao gồm thời gian yêu cầu mất quá nhiều thời gian, mất quá nhiều tài nguyên, v.v.

Vì vậy, thực hiện nhiều lần chèn hàng loạt lớn cùng lúc sẽ hết giờ.

+1

Ass Matt nói. Thông lượng cảm thấy về quyền đối với tôi. Đảm bảo rằng bạn không có chỉ mục trên các bảng của bạn ngoài chỉ mục nhóm. –

+4

Tôi đã kết thúc chèn vào bảng tạm thời song song, và sau đó làm một chèn vào từ những bảng tạm thời vào bảng chính (trong nối tiếp). Điều đó dường như nhanh hơn với tôi, vì việc chèn từ các bảng tạm thời mất ~ 4-5 phút cho khoảng 2 triệu hàng. – kyliod

1

Có thể chạy SQLBulkCopy song song với SQL Azure, ngay cả khi bạn tải cùng một bảng. Bạn cần tự chuẩn bị hồ sơ theo lô trước khi gửi chúng tới API SQLBulkCopy. Điều này hoàn toàn sẽ giúp với hiệu suất, và nó cho phép bạn kiểm soát hoạt động thử lại cho một lô nhỏ hơn của hồ sơ khi bạn nhận được throttled vì lý do bên ngoài của riêng bạn làm.

Hãy xem số blog post so sánh thời gian tải của các cách tiếp cận khác nhau. Có một mã mẫu là tốt. Trong các bài kiểm tra riêng biệt, tôi đã có thể cắt giảm thời gian tải của một nửa bảng.

Đây là kỹ thuật tôi đang sử dụng cho một vài công cụ (Enzo Backup; Sao chép dữ liệu Enzo); Nó không phải là một điều đơn giản để làm nhưng khi thực hiện đúng cách bạn có thể tối ưu hóa thời gian tải đáng kể.