Menggunakan SQL Server 2005.
Saya melakukan DELETE FROM besar tanpa klausa mana. Ini pada dasarnya setara dengan pernyataan TRUNCATE TABLE - kecuali saya tidak diizinkan untuk menggunakan TRUNCATE. Masalahnya adalah meja sangat besar - 10 juta baris, dan dibutuhkan lebih dari satu jam untuk menyelesaikannya. Apakah ada cara untuk membuatnya lebih cepat tanpa:
- Menggunakan Truncate
- Menonaktifkan atau menjatuhkan indeks?
Log-t sudah ada di disk terpisah.
Ada saran!
sql-server
performance
delete
tuseau
sumber
sumber
Jawaban:
Apa yang dapat Anda lakukan adalah penghapusan batch seperti ini:
Di mana xxx, katakanlah, 50000
Modifikasi ini, jika Anda ingin menghapus persentase baris yang sangat tinggi ...
sumber
Anda bisa menggunakan klausa TOP untuk menyelesaikan ini dengan mudah:
sumber
Saya setuju dengan saran untuk mengelompokkan penghapusan Anda ke dalam potongan yang dapat dikelola jika Anda tidak dapat menggunakan TRUNCATE, dan saya suka saran drop / buat orisinalitasnya, tetapi saya ingin tahu tentang komentar berikut dalam pertanyaan Anda:
Saya menduga alasan pembatasan ini berkaitan dengan keamanan yang perlu diberikan untuk langsung memotong tabel dan fakta bahwa itu akan memungkinkan Anda untuk memotong tabel selain yang Anda khawatirkan.
Dengan asumsi itu yang terjadi, saya bertanya-tanya apakah memiliki prosedur tersimpan dibuat yang menggunakan TRUNCATE TABLE dan menggunakan "EXECUTE AS" akan dianggap sebagai alternatif yang layak untuk memberikan hak keamanan yang diperlukan untuk memotong tabel secara langsung.
Mudah-mudahan, ini akan memberi Anda kecepatan yang Anda butuhkan sambil juga mengatasi masalah keamanan yang mungkin dimiliki perusahaan Anda dengan menambahkan akun Anda ke peran db_ddladmin.
Keuntungan lain menggunakan prosedur tersimpan dengan cara ini adalah prosedur tersimpan itu sendiri dapat dikunci sehingga hanya akun tertentu yang diizinkan untuk menggunakannya.
Jika karena alasan tertentu ini bukan solusi yang dapat diterima dan kebutuhan Anda untuk menghapus data dalam tabel ini adalah sesuatu yang perlu dilakukan sekali sehari / jam / dll, saya akan meminta agar pekerjaan SQL Agent dibuat untuk memotong tabel pada waktu yang dijadwalkan setiap hari.
Semoga ini membantu!
sumber
Kecuali terpotong .. hanya menghapus dalam batch yang dapat membantu Anda.
Anda dapat menjatuhkan tabel dan membuatnya kembali, dengan semua kendala dan indeks, tentunya. Di Studio Manajemen, Anda memiliki opsi untuk membuat skrip tabel untuk dijatuhkan dan dibuat, jadi itu harus menjadi opsi sepele. Tapi ini hanya jika Anda diizinkan untuk melakukan tindakan DDL, yang saya lihat itu bukan pilihan.
sumber
Karena pertanyaan ini adalah referensi penting, saya memposting kode ini yang benar-benar membantu saya memahami penghapusan dengan loop dan juga pesan dalam satu lingkaran untuk melacak kemajuan.
Permintaan diubah dari pertanyaan duplikat ini . Kredit ke @RLF untuk basis permintaan.
sumber