Saya memiliki sekitar 84 juta baris. Dari mereka semua perlu ditransfer ke database terpisah di server yang sama, maka saya hapus untuk menghapus sekitar 60 juta baris dari sumber database.
84 juta baris semuanya berada di tabel yang sama. Tabel itu saja menyumbang 90% dari seluruh database.
Jadi ... Sumber: 84 juta baris -> 24 juta baris Tujuan: 0 baris -> 84 juta baris
Sumber menjalankan mode pemulihan penuh, tujuan akan berjalan sederhana.
Saya bertanya-tanya apa cara paling efisien untuk melakukan ini?
Paket A:
1) Masukkan ke tujuan SELECT * DARI sumber
2) Sumber TRUNCATE
3) Masukkan ke dalam sumber PILIH * DARI tujuan DI MANA keep_condition = 1
Rencana B:
1) Kembalikan cadangan basis data sumber sebagai basis data tujuan
2) Jatuhkan setiap tabel kecuali yang dibutuhkan pada database tujuan
3) Sumber TRUNCATE
4) MASUKKAN KE sumber SELECT * DARI tujuan DI MANA keep_condition = 1
Paket C:
1) Masukkan ke tujuan SELECT * DARI sumber
2) DELETE source WHERE keep_condition = 0
atau sesuatu yang lain?
Terima kasih
sumber
Jawaban:
Saya akan menambahkan bahwa, namun Anda memutuskan untuk melakukan pendekatan ini, Anda harus mengelompokkan transaksi ini . Saya sangat beruntung dengan artikel yang ditautkan belakangan ini, dan saya menghargai cara memanfaatkan indeks sebagai lawan dari sebagian besar solusi batch yang saya lihat.
Bahkan dengan penebangan minimal, itu adalah transaksi besar , dan Anda bisa menghabiskan banyak waktu berurusan dengan konsekuensi dari pertumbuhan log yang abnormal (VLF, pemotongan, ukuran kanan, dll.).
Terima kasih
sumber
"Efisien" dapat berlaku untuk penggunaan file log, kinerja I / O, waktu CPU atau waktu eksekusi.
Saya akan mencoba untuk mencapai operasi penebangan minimal, yang akan cukup efisien dari sudut pandang logging. Ini akan menghemat waktu eksekusi Anda sebagai bonus. Jika Anda memiliki ruang tempdb, berikut ini mungkin cocok untuk Anda.
Agar operasi yang dicatat minimal terjadi, sejumlah kondisi harus benar, termasuk tidak ada cadangan yang sedang berjalan, basis data diatur ke
BULK_LOGGED
mode pemulihan, dan tergantung pada indeks Anda, tabel target mungkin harus kosong. Beberapa perilaku ini juga berubah (ditingkatkan) dari SQL Server 2005 ke 2008.Kemudian lagi, tanpa mengetahui spesifikasi tabel dan data Anda, salah satu opsi lain Anda mungkin berkinerja lebih baik. Coba gunakan
.. dan lihat mana yang paling baik.
EDIT : Saat melakukan operasi yang dicatat dalam jumlah besar, pastikan Anda membuat cadangan (log lengkap atau transaksi) sebelum dan setelah operasi jika Anda memerlukan kemampuan pemulihan point-in-time dan Anda curiga ada aktivitas lain yang mungkin terjadi dalam database di saat yang sama saat pekerjaan ETL Anda berjalan.
Saya menulis posting blog tentang operasi yang sedikit dicatat beberapa waktu lalu, ada tautan di sana ke posting dan dokumentasi lain.
sumber
BULK_LOGGED
mode. Terima kasih!Kenapa tidak BCP?
Buka command prompt
bcp server.sourcedb.table out Filename.flt -T -c
bcp "SELECT * FROM sourcedb.table WHERE keep_condition = 1" queryout Filename2.flt -T -c
bcp Server.destinationdb.table in Filename.flt -T -c -b1000
periksa datanya
bcp server.sourcedb.table in Filename2.flt -T -c -b1000
sumber
Jangan berpikir Anda harus merekomendasikan mengubah model pemulihan tanpa cadangan database lengkap atau cadangan t-log sebelum dan sesudah . Salah satu fitur dari model pemulihan BULK_LOGGED adalah bahwa Anda akan kehilangan kemampuan untuk melakukan pemulihan point-in-time untuk t-log yang berisi operasi yang dicatat secara massal. Skenario klasik: backup penuh setiap malam, backup t-log setiap jam. Anda mengubah model pemulihan menjadi log-massal dan memulai operasi Anda. Terjadi kesalahan dan transaksi dibatalkan (atau Anda belum pernah menggunakannya). Namun Anda tidak yakin apa lagi yang terjadi di database sehingga Anda ingin mengembalikan ke titik yang diketahui baik.
Kapan Anda dapat mengembalikan kembali ke? Cadangan t-log terakhir setiap jam yang tidak berisi operasi yang dicatat dalam jumlah besar, berpotensi kehilangan n menit transaksi. Cadangan penuh atau cadangan t-log sebelum mengubah model pemulihan akan membuat titik mundur. Yang mana yang Anda pilih tergantung pada RTO Anda.
sumber
Menjatuhkan partisi dari tabel adalah cara yang sangat cepat dan hemat sumber daya untuk menghapus potongan data besar dari sebuah tabel. Apakah tabel ini dipartisi dengan cara yang mendukung sumber / tujuan Anda membagi jawabannya adalah untuk mengembalikan salinan, jatuhkan tabel redundan dan partisi redundan dari tujuan dan jatuhkan partisi pelengkap dari sumber.
Namun, biaya untuk mengaktifkan partisi mungkin menjadikan ini operasi yang lebih mahal secara keseluruhan.
sumber