2010-02-26 24 views
12

Tôi đang xây dựng hệ thống để cập nhật lượng lớn dữ liệu thông qua các nguồn cấp dữ liệu CSV khác nhau. Thông thường tôi sẽ chỉ lặp lại mặc dù mỗi hàng trong nguồn cấp dữ liệu, thực hiện một truy vấn chọn để kiểm tra xem mục đã tồn tại chưa và chèn/cập nhật một mục tùy thuộc vào nó có tồn tại hay không.Các phương pháp hay nhất để chèn/cập nhật lượng lớn dữ liệu trong SQL Server 2008

Tôi cảm thấy phương pháp này không phải là rất khả năng mở rộng và có thể búa máy chủ trên nguồn cấp dữ liệu lớn hơn. Giải pháp của tôi là lặp qua các mục như bình thường nhưng lưu trữ chúng trong bộ nhớ. Sau đó, đối với mỗi 100 mục hay hơn, hãy chọn trên 100 mục đó và nhận danh sách các mục hiện có trong cơ sở dữ liệu phù hợp. Sau đó nối các câu lệnh chèn/cập nhật lại với nhau và chạy chúng vào cơ sở dữ liệu. Điều này về cơ bản sẽ cắt giảm các chuyến đi đến cơ sở dữ liệu.

Đây có phải là giải pháp đủ khả năng mở rộng và có bất kỳ hướng dẫn ví dụ nào về cách nhập nguồn cấp dữ liệu lớn vào môi trường sản xuất không?

Cảm ơn

Trả lời

13

Thấy rằng bạn đang sử dụng SQL Server 2008, tôi muốn giới thiệu phương pháp này:

  • bulkcopy đầu tiên file CSV của bạn vào một bảng dàn
  • cập nhật bảng mục tiêu của bạn từ đó bảng dàn sử dụng lệnh MERGE

Kiểm tra MSDN docsgreat blog post về cách sử dụng lệnh MERGE.

Về cơ bản, bạn tạo một mối liên hệ giữa bảng dữ liệu thực tế của bạn và các bảng dàn dựng trên một tiêu chí chung (ví dụ như một khóa chính thông thường), và sau đó bạn có thể xác định những việc cần làm khi

  • các hàng phù hợp, ví dụ hàng tồn tại trong cả bảng nguồn và bảng mục tiêu - thường là bạn muốn cập nhật một số trường hoặc chỉ cần bỏ qua tất cả các trường đó
  • hàng từ nguồn không tồn tại trong mục tiêu -> thường là một trường hợp cho một INSERT

Bạn sẽ có một cái gì đó MERGE tuyên bố như thế này:

MERGE TargetTable AS t 
USING SourceTable AS src 
ON t.PrimaryKey = src.PrimaryKey 

WHEN NOT MATCHED THEN 
    INSERT (list OF fields) 
    VALUES (list OF values) 

WHEN MATCHED THEN 
    UPDATE 
    SET (list OF SET statements) 
; 

Tất nhiên, mệnh đề ON có thể được nhiều hơn nữa tham gia nếu cần thiết. Và tất nhiên, các câu lệnh WHEN của bạn cũng có thể phức tạp hơn, ví dụ:

WHEN MATCHED AND (some other condition) THEN ...... 

v.v.

MERGE là một lệnh mới rất mạnh mẽ và rất hữu ích trong SQL Server 2008 - sử dụng nó, nếu bạn có thể!

2

Một cách là nạp CSV của bạn vào một DataTable (hoặc nhiều khả năng một DataReader) và sau đó hàng loạt slam trong các kết quả sử dụng SqlBulkCopy -

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

của nó khá hiệu quả và bạn có thể làm một số ánh xạ cột. Mẹo - khi bạn ánh xạ các cột bằng SqlBulkCopy, chúng phân biệt chữ hoa chữ thường.

0

cách tiếp cận khác sẽ được để viết một thủ tục được lưu trữ trên máy chủ Net trên máy chủ để hoạt động trên toàn bộ tập tin ...

Chỉ khi bạn cần kiểm soát nhiều hơn giải pháp Kris Krause mặc dù - Tôi là một người lớn người hâm mộ giữ nó đơn giản (và có thể tái sử dụng), nơi chúng tôi có thể ...

0

Bạn có cần phải tự mình làm gì ở đây không? Có thể cung cấp dữ liệu theo cách sao cho Máy chủ SQL có thể sử dụng Nhập số lượng lớn để tải nó vào và sau đó xử lý các bản sao trong cơ sở dữ liệu khi quá trình nhập hoàn tất?

Khi nói đến việc nâng hạng nặng với rất nhiều dữ liệu, kinh nghiệm của tôi có xu hướng làm việc trong cơ sở dữ liệu càng nhiều càng tốt thì nhanh hơn và ít tốn nhiều tài nguyên hơn.

2

Cách của bạn là giải pháp tồi tệ nhất có thể. Nói chung, bạn không nên nghĩ về vòng lặp thông qua các bản ghi riêng lẻ. Chúng tôi đã từng sử dụng công cụ nhập được lặp lại thông qua reciords, sẽ mất 18-20 giờ để tải một tệp với hơn một triệu bản ghi (một thứ không phải là sự xuất hiện thường xuyên khi được tạo nhưng nhiều lần ngày xảy ra bây giờ).

Tôi thấy hai tùy chọn: Chèn số lượng lớn sử dụng đầu tiên để tải lên bảng dàn và làm bất kỳ việc dọn dẹp nào bạn cần thực hiện trên bảng đó. Làm cách nào để xác định xem có tồn tại bản ghi không? Bạn sẽ có thể xây dựng một bản cập nhật dựa trên bộ bằng cách tham gia bảng dàn dựng trên các trường xác định bản cập nhật. Thường thì tôi đã thêm một cột vào bảng dàn dựng của tôi cho id của bản ghi mà nó khớp với và điền thông tin đó thông qua truy vấn rồi thực hiện cập nhật. Sau đó, bạn làm một chèn các hồ sơ mà không havea id tương ứng. Nếu bạn có quá nhiều bản ghi để làm tất cả cùng một lúc, bạn có thể chạy theo lô (mà có là một vòng lặp), nhưng làm cho các lô lớn hơn đáng kể so với 1 bản ghi tại một thời điểm (tôi thường bắt đầu với 2000 và sau đó dựa trên thời gian cần để xác định xem tôi có thể làm nhiều hơn hay ít hơn trong lô).

Tôi nghĩ năm 2008 cũng có thống kê hợp nhất nhưng tôi chưa có cơ hội sử dụng nó. Tra cứu nó trong sách trực tuyến.

Cách khác là sử dụng SSIS được tối ưu hóa cho tốc độ.SSIS là một điều phức tạp mặc dù và đường cong học tập là dốc.

+0

+1 để sử dụng BULK INSERT & MERGE –

+0

Cảm ơn đề xuất của bạn. Lý do tôi lặp qua từng mục là vì tôi cần thực hiện một số xác nhận hợp lệ và định dạng logic trước khi thêm nó vào cơ sở dữ liệu. Điều này sau đó chuyển tiếp lại cho người dùng nếu có bất kỳ vấn đề nào với chính nguồn cấp dữ liệu đó. Tôi thích ý tưởng sáp nhập dữ liệu mặc dù, tôi sẽ xem xét điều đó. – markvpc

+0

Bạn cũng có thể dễ dàng xác thực và định dạng theo kiểu thiết lập. Looping thông qua các hồ sơ cá nhân là hầu như luôn luôn là một sự lựa chọn nghèo và bạn không nên xem xét làm điều đó cho đến khi tất cả các tùy chọn khác đã được loại bỏ. – HLGEM

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