Truyền số lượng lớn (84 triệu hàng) dữ liệu một cách hiệu quả


11

Tôi có khoảng 84 triệu hàng. Trong số chúng cần được chuyển đến một cơ sở dữ liệu riêng biệt trên cùng một máy chủ, sau đó tôi xóa để xóa khoảng 60 triệu hàng khỏi cơ sở dữ liệu nguồn.

84 triệu hàng đều nằm trong cùng một bảng. Chỉ riêng bảng đó đã chiếm 90% toàn bộ cơ sở dữ liệu.

Vậy ... Nguồn: 84 triệu hàng -> 24 triệu hàng Đích: 0 hàng -> 84 triệu hàng

Nguồn đang chạy chế độ phục hồi đầy đủ, đích sẽ chạy đơn giản.

Tôi đang tự hỏi điều gì sẽ là cách hiệu quả nhất để làm điều này?

Kế hoạch A:

1) CHỌN VÀO đích CHỌN * TỪ nguồn

2) Nguồn TRUNCATE

3) CHỌN VÀO nguồn CHỌN * TỪ điểm đến WHERE keep_condition = 1

Kế hoạch B:

1) Khôi phục bản sao lưu cơ sở dữ liệu nguồn làm cơ sở dữ liệu đích

2) Bỏ mọi bảng trừ bảng cần thiết trên cơ sở dữ liệu đích

3) Nguồn TRUNCATE

4) CHỌN VÀO nguồn CHỌN * TỪ đích đến WHERE keep_condition = 1

Kế hoạch C:

1) CHỌN VÀO đích CHỌN * TỪ nguồn

2) XÓA nguồn WHERE keep_condition = 0

hay cái gì khác?

Cảm ơn


Tại sao bạn không sử dụng Trình hướng dẫn Nhập và Xuất Dữ liệu? nó là một công cụ được cung cấp với việc cài đặt SQL Server.
Hani El Mouallem

Có thể sao chép 24 triệu hàng vào một bảng mới, sau đó chỉ cần đổi tên hai hàng khi cần để bạn không phải di chuyển 84 triệu hàng một cách không cần thiết?
LowlyDBA

Đây là một quá trình một lần hoặc đang diễn ra? Tôi hỏi bởi vì, với thời gian cần thiết để xử lý các hàng 80M, có khả năng sẽ có những thay đổi dữ liệu trong các hàng sản xuất SOURCE hiện đang tồn tại trong DESTINATION.
Michael Green

Điều này trông giống như một vấn đề XY: Bạn cần kết thúc với tất cả các hàng 84MM trong một DB và 24MM của các hàng trong DB thứ hai. Yêu cầu kinh doanh nào yêu cầu 84MM phải được di chuyển và 60M bị xóa, thay vì chỉ di chuyển 24MM? link: meta.stackexchange.com/questions/66377/what-is-the-xy-probols )
Pieter Geerkens

Tôi có một vấn đề rất giống nhau và rõ ràng không phải là XY. Trước sự phổ biến của các luật liên quan đến việc lưu giữ hồ sơ, chúng tôi đã giữ tất cả dữ liệu. Bây giờ chúng tôi phải xóa các hàng cũ hơn ngày chúng tôi được yêu cầu về mặt pháp lý để giữ chúng. Điều này có nghĩa là lưu trữ và xóa dữ liệu có giá trị hơn 20 năm vì lưu giữ hợp pháp trong hầu hết các trường hợp là 7 năm. Tôi không nghĩ rằng tôi đơn độc khi tin rằng Microsoft sẽ hối hận khi không cung cấp chức năng 'sao chép số lượng lớn' cho các thủ tục được lưu trữ. Một ứng dụng không nên nhanh hơn khi di chuyển dữ liệu 'bên trong' một DB so với chính DB. Năm tới một năm nữa phải được lưu trữ.
bielawski

Câu trả lời:


11

Tôi sẽ nói thêm rằng, tuy nhiên, bạn quyết định tiếp cận điều này, bạn sẽ cần phải xử lý các giao dịch này . Gần đây tôi đã rất may mắn với bài viết được liên kết và tôi đánh giá cao cách nó tận dụng các chỉ mục trái ngược với hầu hết các giải pháp theo đợt mà tôi thấy.

Ngay cả khi đăng nhập tối thiểu, đó là những giao dịch lớn và bạn có thể dành nhiều thời gian để xử lý sự phân nhánh của tăng trưởng nhật ký bất thường (VLF, cắt ngắn, kích thước phải, v.v.).

Cảm ơn


3

"Hiệu quả" có thể áp dụng cho việc sử dụng tệp nhật ký, hiệu năng I / O, thời gian CPU hoặc thời gian thực hiện.

Tôi sẽ cố gắng để đạt được một hoạt động đăng nhập tối thiểu, sẽ khá hiệu quả từ góc độ đăng nhập. Điều này sẽ giúp bạn tiết kiệm một số thời gian thực hiện một phần thưởng. Nếu bạn có không gian tempdb, những điều sau đây có thể phù hợp với bạn.

CREATE TABLE #temp;
ALTER source -> BULK_LOGGED recovery model

BEGIN TRANSACTION;

    INSERT INTO dest SELECT FROM source;
    INSERT INTO #temp SELECT FROM source WHERE keep_condition=1;
    TRUNCATE TABLE source;
    INSERT INTO source SELECT FROM #temp;

COMMIT TRANSACTION;

ALTER source -> FULL recovery model
DROP TABLE #temp;

Để một hoạt động được ghi lại tối thiểu xảy ra, một số điều kiện phải đúng, bao gồm không có bản sao lưu hiện đang chạy, cơ sở dữ liệu được đặt ở BULK_LOGGEDchế độ khôi phục và tùy thuộc vào chỉ mục của bạn, bảng mục tiêu có thể phải trống. Một số hành vi này cũng đã thay đổi (được cải thiện) từ SQL Server 2005 sang 2008.

Sau đó, một lần nữa, mà không biết chi tiết cụ thể của bảng và dữ liệu của bạn, bất kỳ tùy chọn nào khác của bạn có thể hoạt động tốt hơn. Hãy thử sử dụng

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

.. và xem cái nào hoạt động tốt nhất.

EDIT : Khi thực hiện các hoạt động được ghi nhật ký hàng loạt, hãy đảm bảo bạn tạo bản sao lưu (nhật ký đầy đủ hoặc nhật ký giao dịch) trước và sau hoạt động nếu bạn cần khả năng khôi phục tại thời điểm và bạn nghi ngờ rằng hoạt động khác có thể đang diễn ra trong cơ sở dữ liệu tại cùng thời gian mà công việc ETL của bạn đang chạy.

Tôi đã viết một bài đăng trên blog về các hoạt động được ghi lại tối thiểu một thời gian trước đây, có các liên kết trong đó đến các bài viết và tài liệu khác.


+1 để khuyên OP thử nghiệm để xem cái nào hoạt động tốt hơn. Tất nhiên, điều đó có thể hơi khó để có được số thực trừ khi anh ta có một hệ thống trùng lặp trong dev, v.v.
Max Vernon

Chỉ là một câu hỏi, Điều gì sẽ xảy ra nếu bạn cố gắng thực hiện khôi phục thời điểm khi cơ sở dữ liệu ở chế độ ghi nhật ký hàng loạt? Tôi cho rằng bất kỳ giao dịch nào không đủ điều kiện là "số lượng lớn" sẽ có thể được phục hồi.
elty123

1
@ elty123 Trong phục hồi đăng nhập hàng loạt, bạn chỉ có thể khôi phục để sau đó kết thúc bản sao lưu nhật ký cuối cùng của mình. Không có điểm nào trong thời gian phục hồi như sẽ có với sự phục hồi hoàn toàn. Thông thường, bạn chuyển sang phục hồi đăng nhập hàng loạt, chạy một số quy trình ETL, chuyển trở lại đầy đủ và sau đó thực hiện sao lưu nhật ký.
RubberChickenLeader

@WindRaven Điều này không đúng - xem câu trả lời của tôi dưới đây.
wBob

1
@wBob và @WindRaven, tôi đã cập nhật câu trả lời của mình để phản ánh nhu cầu thực hiện sao lưu trước và sau khi sử dụng BULK_LOGGEDchế độ. Cảm ơn!
Daniel Hutmacher

1

Tại sao không BCP?

  1. Sao lưu nguồn gốc
  2. Thay đổi sourcedb thành đăng nhập hàng loạt
  3. Mở dấu nhắc lệnh

  4. bcp server.sourcedb.table out Filename.flt -T -c

  5. bcp "SELECT * FROM sourcedb.table WHERE keep_condition = 1" queryout Filename2.flt -T -c

  6. bcp Server.destinationdb.table in Filename.flt -T -c -b1000

  7. kiểm tra dữ liệu

  8. Từ SSMS Rút ngắn bảng nguồn
  9. bcp server.sourcedb.table in Filename2.flt -T -c -b1000
  10. Thay đổi nguồn gốc trở lại đầy đủ

2
Bởi vì họ đang ở trên cùng một máy chủ. Viết ra hệ thống tập tin sẽ tốn kém. Tốt hơn là tạo một cơ sở dữ liệu và đặt trước nó, hy vọng tận dụng việc khởi tạo tệp ngay lập tức. Đây sẽ là lựa chọn hợp lý cho các dbs trên các máy chủ khác nhau mặc dù SSIS sẽ là lựa chọn đầu tiên của tôi nếu có. NB: Tùy chọn -n (bản địa) nhỏ gọn hơn và an toàn hơn cho việc di chuyển dữ liệu từ SQL Server sang SQL Server. Tùy chọn -b không có hiệu lực cho bcp out.
wBob

0

Đừng nghĩ rằng bạn nên khuyến nghị thay đổi mô hình khôi phục mà không cần sao lưu cơ sở dữ liệu đầy đủ hoặc sao lưu t-log trước và sau . Một trong những tính năng của mô hình khôi phục BULK_LOGGED là bạn sẽ mất khả năng thực hiện khôi phục tại thời điểm cho các nhật ký t có chứa các hoạt động được ghi nhật ký hàng loạt. Kịch bản cổ điển: sao lưu toàn bộ hàng đêm, sao lưu t-log hàng giờ. Bạn thay đổi mô hình khôi phục thành đăng nhập hàng loạt và bắt đầu hoạt động. Đã xảy ra lỗi và giao dịch quay trở lại (hoặc bạn chưa sử dụng). Tuy nhiên, bạn không chắc chắn điều gì khác đang diễn ra trong cơ sở dữ liệu nên bạn muốn khôi phục lại điểm tốt đã biết.

Khi nào bạn có thể khôi phục trở lại? Sao lưu t-log hàng giờ không chứa các hoạt động được ghi nhật ký hàng loạt, có khả năng mất n phút giao dịch. Một bản sao lưu đầy đủ hoặc sao lưu t-log trước khi thay đổi mô hình khôi phục sẽ tạo ra một điểm dự phòng. Cái nào bạn chọn phụ thuộc vào RTO của bạn.


0

Bỏ các phân vùng ra khỏi một bảng là một cách thực sự nhanh chóng và tiết kiệm tài nguyên để loại bỏ các khối dữ liệu lớn khỏi một bảng. Bảng này được phân vùng theo cách hỗ trợ phân chia nguồn / đích của bạn, câu trả lời sẽ là khôi phục một bản sao, loại bỏ các bảng dự phòng và (các) phân vùng dự phòng khỏi đích và thả các phân vùng bổ sung từ nguồn.

Tuy nhiên, chi phí cho phép phân vùng có thể làm cho điều này trở thành một hoạt động đắt tiền hơn, tuy nhiên.

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.