SQL Server - Ekspor tabel besar tanpa kunci primer

9

Saya perlu menyinkronkan tabel besar ~ 500 juta baris tanpa kunci utama antara SQL Server dan MySQL. Tabel hanya memiliki indeks non-unik gabungan berkerumun.

Saya memang memiliki koneksi ODBC antara server, tetapi impor ~ 8 juta baris membutuhkan waktu sekitar 45 menit, jadi saya percaya impor tunggal yang lebih besar tidak masuk akal karena gangguan dapat terjadi pada titik mana pun. Saya tidak bisa mengubah struktur tabel yang ada, saya bisa menambahkan tabel lain. Setelah membaca lebih lanjut, offset / pengambilan bukan pilihan untuk tabel besar. "Pilih ... di mana x antara ... dan ..." bukan opsi karena saya tidak memiliki kunci unik.

Bagaimana saya bisa mengekspor tabel dalam batch yang dijamin mengandung semua baris? Masalah saya adalah karena kunci cluster tidak unik, memesan setelah itu tidak akan menjamin baris fisik memiliki urutan yang sama antara permintaan berturut-turut dan memesan setelah semua kolom akan memakan waktu terlalu lama. Dan bagaimana Anda akan merekomendasikan untuk memigrasi kumpulan, melalui file ODBC atau CSV?

tidak seorangpun
sumber
Ini akan berulang (operasi ususal) atau operasi satu kali?
Bogdan Bogdanov
Ekspor awal akan menjadi operasi satu kali, sinkronisasi perubahan seperti catatan atau pembaruan baru harus berulang. CDC bukan opsi, tetapi akan menyelidiki lebih lanjut setelah migrasi awal.
tidak seorang pun
Saya pikir untuk menerima bantuan tentang ini, Anda harus menjelaskan lebih detail seluruh proses (sepertinya Anda memiliki masalah yang sangat kompleks)
Bogdan Bogdanov
Anda perhatikan "karena kunci yang dikelompokkan tidak unik, memesan setelah itu tidak akan menjamin baris fisik memiliki urutan yang sama antara permintaan berturut-turut". Karena urutan baris tidak dipertahankan (kecuali jika Anda memiliki beberapa data urutan), Anda tidak dapat mengandalkan untuk mendapatkan urutan baris fisik yang sama. Urutan baris tidak secara default untuk urutan penyisipan atau urutan indeks, tetapi ditentukan oleh klausa ORDER BY .
RLF
Ya, RLF, saya setuju. Kolom semua int, A, B, C, D, E. Kunci Clustered ada di ABC. Kombinasi ABC tidak unik, juga bukan kombinasi ABCD. Apakah "memesan berdasarkan" kolom yang tidak unik memungkinkan saya untuk mengekspor seluruh tabel dalam batch? Dan Bogdan Bodganov, platform Stack mencegah masalah yang kompleks, lebih baik hanya menjawab pertanyaan itu. Bagaimana cara mengekspor tabel besar lengkap secepat mungkin dalam batch tanpa kehilangan baris?
tidak seorang pun

Jawaban:

0

Dengan asumsi Anda tidak memiliki pembaruan atau penghapusan terhadap tabel sumber Anda dapat mencoba yang berikut:
1. Buat salinan tabel yang ada menggunakan sintaks CTAS (untuk SQLServer itu SELECT * into source_table_copy FROM source_table). Operasi seperti itu sangat cepat bahkan untuk meja besar.
2. Tambahkan after insertpemicu pada source_tablesalinan [s] rekaman baru itu ke source_table_copy.
3. Sekarang ketika semua catatan baru source_tablemasuk source_table_copyjuga, dan Anda dapat memindahkan data dari tabel yang disalin ke Mysql dalam batch. Misalnya, jika Anda memiliki tautan antara 2 server, semuanya dapat dilakukan di dalam tubuh prosedur tersimpan TSQL.
Misalnya sepotong kode yang bergerak hingga 20 catatan ke server baru mungkin terlihat seperti

 --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; 

Dimungkinkan juga untuk menggunakan CURSOR untuk membaca data dan kemudian menghapus dengan where current ofklausa.

** Idealnya Anda perlu mencegah aplikasi memasukkan data ke source_tabledalam langkah 1. Jika itu benar-benar mustahil, saya akan pergi dengan after insertpemicu yang ditambahkan tepat sebelum langkah 1 dan dihapus tepat setelah itu dilakukan yang menyalin data ke beberapa tabel lain yang saya bisa kemudian bergabung dengan source_table_copy.

a1ex07
sumber
Terima kasih atas solusinya, saya mencoba sesuatu juga, namun dengan memasukkan yang normal. Saya akan mencoba sintaks CTAS untuk melihat apakah mempercepat. Pertanyaan tindak lanjut, jika Anda tidak keberatan: apakah "after insert trigger" akan memengaruhi kinerja?
tidak seorang pun
Karena tubuh pemicu sangat sederhana (cukup masukkan data ke tabel lain), dampak kinerja akan minimal.
a1ex07