2013-07-09 48 views
12

Tôi đang tải lượng lớn dữ liệu từ tệp văn bản vào SQL Server. Hiện tại mỗi bản ghi được chèn vào (hoặc được cập nhật) trong một giao dịch riêng biệt, nhưng điều này khiến cho DB ở trạng thái xấu nếu bản ghi không thành công.Giới hạn kích thước giao dịch trong SQL Server

Tôi muốn đặt tất cả trong một giao dịch lớn. Trong trường hợp của tôi, tôi đang xem ~ 250.000 chèn hoặc cập nhật và có thể ~ 1.000.000 truy vấn. Các tập tin văn bản là khoảng 60MB.

Việc đưa toàn bộ hoạt động vào một giao dịch có bất hợp lý không? Yếu tố hạn chế là gì?

Trả lời

10

Nó không chỉ là không hợp lý để làm như vậy, nhưng nó là phải trong trường hợp bạn muốn giữ nguyên toàn vẹn trong trường hợp bất kỳ hồ sơ không thành công, vì vậy bạn nhận được một "tất cả hoặc không có gì" nhập khẩu như bạn lưu ý. 250000 chèn hoặc cập nhật sẽ không có vấn đề gì đối với SQL để xử lý, nhưng tôi sẽ xem xét triệu truy vấn đó là gì. Nếu chúng không cần thiết để thực hiện sửa đổi dữ liệu, tôi sẽ đưa chúng ra khỏi giao dịch, vì vậy chúng không làm chậm toàn bộ quá trình.

Bạn phải xem xét rằng khi bạn có giao dịch mở (bất kể kích thước), giao diện sẽ xảy ra tại các bảng mà nó chạm và giao dịch lâu dài như giao dịch của bạn có thể gây cản trở cho người dùng khác. thời gian. Nếu bạn mong đợi việc nhập khẩu lớn và tốn thời gian và hệ thống sẽ bị tải, hãy xem xét thực hiện toàn bộ quá trình qua đêm (hoặc bất kỳ giờ cao điểm nào) để giảm thiểu tác động.

Về kích thước, không có giới hạn kích thước cụ thể trong SQL Server, chúng có thể sửa đổi về mặt lý thuyết bất kỳ lượng dữ liệu nào mà không gặp sự cố. Giới hạn thực tế thực sự là kích thước của tệp nhật ký giao dịch của cơ sở dữ liệu đích. Công cụ DB lưu trữ tất cả dữ liệu tạm thời và sửa đổi trong tệp này trong khi giao dịch đang diễn ra (vì vậy nó có thể sử dụng nó để cuộn lại nếu cần), do đó tệp này sẽ tăng kích thước. Nó phải có đủ không gian trống trong các thuộc tính DB và đủ không gian HD để tệp phát triển. Ngoài ra, hàng hoặc bảng khóa mà động cơ sẽ đặt trên các bảng bị ảnh hưởng tiêu thụ bộ nhớ, do đó, máy chủ phải có đủ bộ nhớ miễn phí cho tất cả các hệ thống ống nước này quá. Dù sao, 60MB trong kích thước thường là quá ít để lo lắng về nói chung. 250.000 hàng là đáng kể, nhưng không phải là quá nhiều, vì vậy bất kỳ máy chủ có kích thước phong nha sẽ có thể xử lý nó.

0

Cá nhân tôi không tải dữ liệu đã nhập trực tiếp vào các bảng sản xuất của tôi và tôi loại bỏ tất cả các bản ghi sẽ không đi qua được từ lâu trước khi tôi đến điểm tải. Một số loại lỗi sẽ xóa hoàn toàn việc nhập và những loại khác có thể chỉ gửi bản ghi tới một bảng ngoại lệ để được gửi lại cho nhà cung cấp và được cố định cho lần tải tiếp theo. Thông thường tôi có logic xác định nếu có quá nhiều ngoại lệ và cũng giết chết gói đó.

Ví dụ giả sử thành phố là trường được nạp lại trong cơ sở dữ liệu của bạn và trong tệp của 1.000.000 bản ghi, bạn có mười thành phố không có thành phố. Nó có lẽ là tốt nhất để gửi chúng đến một bảng ngoại lệ và tải phần còn lại. Nhưng giả sử bạn có 357,894 hồ sơ không có thành phố. Sau đó, bạn có thể cần phải có một cuộc trò chuyện với các nhà cung cấp dữ liệu để có được dữ liệu cố định trước khi tải. Nó chắc chắn sẽ ảnh hưởng đến prod ít hơn nếu bạn có thể xác định rằng tập tin là unuseable trước khi bạn bao giờ cố gắng ảnh hưởng đến các bảng sản xuất.

Ngoài ra, tại sao bạn lại làm một bản ghi này tại một thời điểm? Bạn có thể thường đi nhanh hơn nhiều với xử lý dựa trên bộ, đặc biệt là nếu bạn đã quản lý để làm sạch dữ liệu trước. Bây giờ bạn vẫn có thể cần phải làm theo lô, nhưng một bản ghi tại một thời điểm có thể rất chậm.

Nếu bạn thực sự muốn khôi phục toàn bộ nội dung nếu có bất kỳ lỗi nào, bạn cần sử dụng giao dịch. Nếu bạn làm điều này trong SSIS, sau đó bạn có thể đặt giao dịch trên chỉ là một phần của gói mà bạn ảnh hưởng đến các bảng prod và không lo lắng về chúng trong dàn dựng của dữ liệu và các bộ phận làm sạch.

0

Không có vấn đề gì khi thực hiện thao tác hàng loạt hoặc không có gì cả, trừ khi hoàn tất khôi phục hoàn toàn có vấn đề cho doanh nghiệp của bạn. Trong thực tế, một giao dịch duy nhất là hành vi mặc định cho rất nhiều tiện ích chèn hàng loạt.

Tôi thực sự khuyên bạn nên chống lại một hoạt động trên mỗi hàng. Nếu bạn muốn loại bỏ dữ liệu xấu, bạn có thể tải dữ liệu vào bảng dàn xếp trước tiên và chuyên nghiệp về mặt ngữ pháp xác định "dữ liệu xấu" và bỏ qua các hàng đó.

3

Máy chủ SQL có thể xử lý các giao dịch kích thước đó. Chúng tôi sử dụng một giao dịch duy nhất để tải hàng loạt hàng triệu bản ghi.

Phần đắt nhất của hoạt động cơ sở dữ liệu thường là kết nối máy chủ khách và lưu lượng truy cập. Để chèn/cập nhật chỉ mục và ghi nhật ký cũng tốn kém, nhưng bạn có thể giảm thiểu các chi phí đó bằng cách sử dụng các kỹ thuật tải chính xác (xem bên dưới). Bạn thực sự muốn giới hạn số lượng kết nối và dữ liệu được chuyển giữa máy khách và máy chủ.

Để kết thúc, bạn nên cân nhắc tải hàng loạt dữ liệu bằng SSIS hoặc C# bằng SqlBulkCopy. Khi bạn tải hàng loạt mọi thứ, bạn có thể sử dụng các hoạt động dựa trên thiết lập TRÊN MÁY CHỦ để cập nhật hoặc xác minh dữ liệu của bạn.

Hãy xem câu hỏi này để có thêm đề xuất về tối ưu hóa tải dữ liệu. Câu hỏi có liên quan đến C# nhưng rất nhiều thông tin hữu ích cho SSIS hoặc các phương thức tải khác. What's the fastest way to bulk insert a lot of data in SQL Server (C# client).

Các vấn đề liên quan