SQL Server - Xuất bảng lớn không có khóa chính


9

Tôi cần đồng bộ hóa một bảng lớn ~ 500 triệu hàng mà không cần khóa chính giữa SQL Server và MySQL. Bảng chỉ có một chỉ mục tổng hợp không duy nhất cụm.

Tôi có kết nối ODBC giữa các máy chủ, nhưng quá trình nhập ~ 8 triệu hàng mất khoảng 45 phút, vì vậy tôi tin rằng một lần nhập lớn hơn sẽ không hợp lý vì có thể xảy ra gián đoạn tại bất kỳ thời điểm nào. Tôi không thể thay đổi cấu trúc bảng hiện có, tôi có thể thêm các bảng khác. Sau khi đọc thêm, offset / tìm nạp không phải là một tùy chọn cho các bảng lớn. "Chọn ... trong đó x giữa ... và ..." không phải là một tùy chọn vì tôi không có khóa duy nhất.

Làm cách nào tôi có thể xuất bảng theo lô được đảm bảo để chứa tất cả các hàng? Vấn đề của tôi là vì khóa cụm không phải là duy nhất, nên việc đặt hàng sau nó sẽ không đảm bảo các hàng vật lý có cùng thứ tự giữa các truy vấn liên tiếp và thứ tự sau khi tất cả các cột sẽ mất quá nhiều thời gian. Và làm thế nào bạn muốn giới thiệu để di chuyển các lô, thông qua các tệp ODBC hoặc CSV?


Điều này sẽ được lặp lại (hoạt động bình thường) hoặc hoạt động một lần?
Bogdan Bogdanov

Xuất ban đầu sẽ là hoạt động một lần, đồng bộ hóa thay đổi như bản ghi hoặc cập nhật mới sẽ được lặp đi lặp lại. CDC không phải là một tùy chọn, nhưng sẽ điều tra thêm sau khi di chuyển ban đầu.
không ai

Tôi nghĩ để nhận được sự giúp đỡ về vấn đề này, bạn phải giải thích chi tiết hơn toàn bộ quá trình (có vẻ như bạn có vấn đề rất phức tạp)
Bogdan Bogdanov

Bạn lưu ý "vì khóa cụm không phải là duy nhất, nên việc đặt hàng sau nó sẽ không đảm bảo các hàng vật lý có cùng thứ tự giữa các truy vấn liên tiếp". Vì thứ tự hàng không được bảo toàn (trừ khi bạn có một số dữ liệu chuỗi), bạn không thể dựa vào việc nhận được thứ tự hàng vật lý tương tự. Thứ tự các hàng không mặc định theo thứ tự chèn cũng như thứ tự chỉ mục, nhưng được xác định bởi mệnh đề ORDER BY .
RLF

Vâng, RLF, tôi đồng ý. Các cột là tất cả các int, A, B, C, D, E. Khóa cụm nằm trên ABC. Một kết hợp ABC không phải là duy nhất, cũng không phải là kết hợp ABCD. "Đặt hàng theo" một cột không duy nhất có cho phép tôi xuất toàn bộ bảng theo lô không? Và Bogdan Bodganov, nền tảng Stack ngăn chặn các vấn đề phức tạp, tốt hơn là chỉ cần giải quyết câu hỏi. Làm thế nào để xuất bảng lớn hoàn thành nhanh nhất có thể theo lô mà không mất hàng?
không ai

Câu trả lời:


0

Giả sử bạn không có các bản cập nhật hoặc xóa đối với bảng nguồn, bạn có thể thử các cách sau:
1. Tạo một bản sao của bảng hiện có bằng cú pháp CTAS (đối với SQLServer SELECT * into source_table_copy FROM source_table). Hoạt động như vậy là rất nhanh ngay cả đối với các bảng lớn.
2. Thêm after insertkích hoạt trên source_tableđó sao chép bản ghi mới [s] vào source_table_copy.
3. Bây giờ khi tất cả các kỷ lục mới trong source_tableđi đến source_table_copylà tốt, và bạn có thể chuyển dữ liệu từ bảng sao chép vào Mysql trong lô. Chẳng hạn, nếu bạn có một liên kết giữa 2 máy chủ, mọi thứ đều có thể được thực hiện trong phần thân của thủ tục lưu trữ TSQL.
Ví dụ: một đoạn mã di chuyển tới 20 bản ghi đến máy chủ mới có thể trông giống như

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

Cũng có thể sử dụng CURSOR để đọc dữ liệu và sau đó xóa bằng where current ofmệnh đề.

** Lý tưởng nhất là bạn cần ngăn các ứng dụng chèn dữ liệu vào source_tabletrong bước 1. Nếu hoàn toàn không thể, tôi sẽ sử dụng trình after insertkích hoạt được thêm ngay trước bước 1 và xóa ngay sau khi hoàn thành sao chép dữ liệu sang một bảng khác. sau này hợp nhất với source_table_copy.


Cảm ơn bạn về giải pháp, tôi cũng đã thử một cái gì đó, tuy nhiên với một chèn bình thường. Tôi sẽ thử cú pháp CTAS để xem liệu nó có tăng tốc mọi thứ không. Câu hỏi tiếp theo, nếu bạn không phiền: "sau khi kích hoạt chèn" có ảnh hưởng đến hiệu suất không?
không ai vào

Vì phần thân kích hoạt rất đơn giản (chỉ cần chèn dữ liệu vào một bảng khác), tác động hiệu suất sẽ là tối thiểu.
a1ex07
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.