Cách nhanh nhất để xuất bảng thành tệp văn bản là gì


17

Tôi sẽ có cơ sở dữ liệu SQL Server 2012 và một bảng có 3 triệu hàng và có thể 50 cột. Điều gì sẽ là cách nhanh nhất cho một quá trình .net nền không được giám sát (có thể phát hành một số lệnh SQL hoặc Powershell) để xuất nó thành tệp văn bản, một dòng cho mỗi hàng dữ liệu? Quá trình .net nên biết khi xuất xong hoặc nếu có bất kỳ lỗi nào. Kiểu dữ liệu sẽ là tất cả inthoặc nvarchar.

Tôi giả sử rằng một mã C # thuần sử dụng ado.net để thực thi một select *lệnh và lặp qua bộ dữ liệu và ghi vào một tệp cho mỗi bản ghi sẽ chậm và không có cách nào tôi có thể song song hóa điều này.

Lý tưởng nhất là xuất sẽ là một thư mục mạng được chia sẻ từ xa chứ không phải là một thư mục cục bộ trên máy SQL Server. Máy chủ SQL sẽ là một cụm HA. SSIS có phù hợp hơn cho việc này không, không cần chuyển đổi dữ liệu?

Quá trình .Net sẽ chạy trên Máy A, Máy chủ SQL trên Máy B và đích tệp cuối cùng là chia sẻ mạng. Một tùy chọn là máy chủ SQL ghi tệp trực tiếp vào mạng chia sẻ. Tùy chọn khác là SQL Server ghi vào máy A và sau đó khi tệp được ghi, quá trình .net sẽ sao chép nó vào mạng chia sẻ. Tôi không có SLA chính thức nhưng mong đợi 30 phút - 1 giờ cho việc ghi tệp.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- ứng dụng .NET sẽ chạy từ đâu? Trường hợp xấu nhất, điều này có thể có nghĩa là dữ liệu phải di chuyển qua 2 bước nhảy mạng, đây có thể sẽ là nút cổ chai lớn nhất. Ngoài ra, số lượng hàng có phần không liên quan - tổng kích thước dữ liệu gần đúng là bao nhiêu? Bạn có SLA hiệu suất bạn cần đáp ứng cho quá trình này?
Jon Seigel

Câu trả lời:


10

Xoay quanh tất cả các bài viết đó là một tùy chọn nếu bạn muốn xem cũ thực hiện nó.

Một số tùy chọn khác nhau mà bạn nên thử là:

Và bạn có thể thử tất cả các tùy chọn này trong khi lặp trong một phiên khác, chỉ để cho vui :-).


4

Tôi chỉ đơn giản là sử dụng Trình hướng dẫn Xuất nhập khẩu. Cuối cùng, bạn được cung cấp tùy chọn để lưu tác vụ, sau đó bạn có thể lên lịch với SQL Server Agent. Tự thêm mình làm nhà điều hành và định cấu hình DB Mail trên máy chủ và nó có thể gửi email cho bạn khi công việc hoàn thành hoặc thất bại.

Nghiêm túc, tại sao phát minh lại bánh xe?

http://msdn.microsoft.com/en-us/l Library / ms140052.aspx


Không tệ chút nào, thực sự điều này tiết kiệm một gói SSIS ở cuối. Nếu đó là nhiệm vụ một lần duy nhất thì đó có thể là một giải pháp.
Mary

2

Những người khác đã tuyên bố rằng bcp nên là cách nhanh nhất nhưng tôi không thấy bất kỳ lợi thế nào so với giải pháp CLR. Khi chèn vào bảng cơ sở dữ liệu, các triển khai sao chép số lượng lớn khác nhau sẽ luôn giành chiến thắng. Điều này chủ yếu là do cách họ giảm thiểu ghi nhật ký và cho phép ghi đa luồng. Bạn không có những ràng buộc này khi ghi vào một tệp phẳng.

Trong công việc của tôi, chúng tôi sử dụng CLR để kết xuất đầu ra truy vấn vào một tệp. Chúng tôi cũng kết hợp Ionic.Zip.dll để tệp có thể được tự động nén sau khi tạo.

Đây là một ví dụ mà op tuyên bố là nhanh gấp đôi bcp trên blobs: /programming/10325338/fastest-way-to-export-blobs-from-table-into-inderson-files


Câu hỏi đặc biệt đó không chi tiết lắm. Tôi khuyên bạn nên đọc câu hỏi sau - Tối ưu hóa hiệu suất BCP cho dữ liệu BLOB tại đây. Nó chắc chắn sẽ đưa ra ý tưởng về nhiều tùy chọn chơi mà bạn có chỉ với BCP :-).
Mary

Tôi thấy các liên kết và hoàn toàn đồng ý. Nhưng hầu hết các điểm tối ưu hóa là để tải dữ liệu vào máy chủ sql. Tôi chưa thấy bất kỳ sự thật nào liên quan đến bcp nhanh hơn giải pháp CLR hoặc bộ phim truyền hình khi ghi dữ liệu sql vào một tệp phẳng.
brian

1

Bạn có thể tạo gói SSIS đơn giản:

Đây là một cách cao cấp để:

  1. Tạo kết nối OLEDB với cơ sở dữ liệu trong trình quản lý kết nối
  2. Kéo Chuyển đổi luồng dữ liệu vào luồng điều khiển và sau đó nhấp vào nó để đến luồng dữ liệu.
  3. Kéo Nguồn OLEDB từ hộp công cụ vào luồng dữ liệu và chỉnh sửa nó để nó kết nối với bảng mong muốn của bạn bằng kết nối bạn đã tạo ở bước 1
  4. Kéo Đích tệp phẳng từ hộp công cụ vào luồng dữ liệu và kết nối nguồn OLEDB với nó.
  5. Chọn "Mới" trong Đích tệp phẳng và nó sẽ tạo một tệp phẳng mới có cùng cấu trúc cột và bạn có thể sử dụng dấu phân cách mong muốn hoặc có thể cố định với tệp nếu bạn muốn.
  6. Chạy nó

Bất kỳ noob sẽ có thể tìm ra điều này. Một người Anti-GUI sẽ không thích giải pháp này, vì vậy hãy lưu ý kiến ​​về vấn đề đó, nó chỉ là một giải pháp thay thế cho những cá nhân kém hiểu biết về công nghệ, những người đấu tranh bằng BCP ...

Bạn có một chút linh hoạt hơn trong cách định dạng tệp dữ liệu. Bạn có thể làm điều này trong BCP và tất cả những thứ đó, nhưng điều này sẽ loại bỏ sự phức tạp của nó. Nhưng có một lợi thế nhỏ khi bạn có thể đặt tiêu đề tệp tùy chỉnh và tạo "Tên cột" làm hàng đầu tiên, giúp tệp phẳng dễ tiêu thụ hơn.

Đừng quên lưu nó, nếu bạn đã tạo nó một lần, bạn có thể sẽ được hỏi lại! Hi vọng điêu nay co ich..


0

Tôi nghĩ bcp.exe từ dòng lệnh nên là cách nhanh nhất.

http://msdn.microsoft.com/en-us/l Library / ms162802.aspx


5
Trong khi bạn có thể đúng, bạn có thể làm sáng tỏ chi tiết về giải pháp này? Làm thế nào nó được sử dụng (một liên kết đến các tài liệu có thể là đủ), tại sao bạn nghĩ rằng nó là nhanh hơn, vv
dezso
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.