Saya mencoba untuk mendapatkan pemahaman yang lebih besar tentang perbedaan antara perintah DELETE
dan TRUNCATE
perintah. Pemahaman saya tentang internal berjalan di sepanjang garis:
DELETE
-> mesin basis data menemukan dan menghapus baris dari halaman data yang relevan dan semua halaman indeks di mana baris dimasukkan. Dengan demikian, semakin banyak indeks, semakin lama proses penghapusan.
TRUNCATE
-> cukup menghapus semua halaman data tabel secara massal menjadikan ini pilihan yang lebih efisien untuk menghapus isi tabel.
Anggap hal di atas benar (mohon perbaiki saya jika tidak):
- Bagaimana berbagai mode pemulihan memengaruhi setiap pernyataan? Jika ada efek sama sekali
- Saat menghapus, apakah semua indeks dipindai atau hanya indeks yang barisnya ada? Saya akan menganggap semua indeks dipindai (dan tidak dicari?)
- Bagaimana perintah direplikasi? Apakah perintah SQL dikirim dan diproses pada setiap pelanggan? Atau MSSQL sedikit lebih pintar dari itu?
sql-server
database-internals
Stuart Blackler
sumber
sumber
DELETE
danTRUNCATE
dalam jawaban atas pertanyaan ini tentang kegunaanTRUNCATE
-ing segera sebelum aDROP
. Anda juga bisa menggali log sendiri untuk mempelajari efek dari kedua perintah menggunakan teknik yang dijelaskan dalam jawaban ini .TRUNCATE
dapat diputar kembali. Nick membahas hal itu dalam jawabannya terhadap pertanyaan yang ia tautkan .Jawaban:
Ya, meskipun ada dua opsi di sini. Baris dapat dihapus dari indeks baris demi baris oleh operator yang sama yang melakukan penghapusan tabel dasar. Ini dikenal sebagai paket pembaruan yang sempit (atau per-baris):
Atau, penghapusan indeks nonclustered dapat dilakukan oleh operator terpisah, satu per indeks nonclustered. Dalam hal ini (dikenal sebagai rencana pembaruan lebar, atau per indeks) set lengkap tindakan disimpan di meja kerja (spool yang diinginkan) sebelum diputar ulang satu kali per indeks, sering secara eksplisit diurutkan berdasarkan kunci indeks nonclustered tertentu untuk mendorong berurutan pola akses.
Iya nih.
TRUNCATE TABLE
lebih efisien karena sejumlah alasan:Penghapusan selalu dicatat sepenuhnya (setiap baris yang dihapus dicatat dalam log transaksi). Ada beberapa perbedaan kecil dalam isi catatan log jika model pemulihan selain dari itu
FULL
, tetapi ini secara teknis masih log penuh.Menghapus baris dalam indeks (menggunakan paket pembaruan sempit atau lebar yang ditunjukkan sebelumnya) selalu merupakan akses dengan kunci (pencarian). Memindai seluruh indeks untuk setiap baris yang dihapus akan sangat tidak efisien. Mari kita lihat kembali pada rencana pembaruan per-indeks yang ditunjukkan sebelumnya:
Rencana pelaksanaan adalah pipa yang digerakkan oleh permintaan: operator induk (ke kiri) mendorong operator anak untuk melakukan pekerjaan dengan meminta satu baris pada satu waktu dari mereka. Operator Sortir memblokir (mereka harus menggunakan seluruh input mereka sebelum menghasilkan baris yang diurutkan pertama), tetapi mereka masih digerakkan oleh orang tua mereka (Penghapusan Indeks) yang meminta baris pertama. Penghapusan Indeks menarik satu baris sekaligus dari Sort yang selesai, memperbarui indeks target nonclustered untuk setiap baris.
Dalam paket pembaruan yang luas, Anda akan sering melihat kolom yang ditambahkan ke aliran baris oleh operator pembaruan tabel dasar. Dalam hal ini, Penghapusan Indeks Berkelompok menambahkan kolom kunci indeks tidak tercakup ke aliran. Data ini diperlukan oleh mesin penyimpanan untuk menemukan baris yang akan dihapus dari indeks yang tidak tercakup:
Pemotongan tidak diizinkan pada tabel yang diterbitkan menggunakan replikasi transaksional atau gabungan. Bagaimana penghapusan direplikasi tergantung pada jenis replikasi dan bagaimana hal itu dikonfigurasi. Misalnya, replikasi snapshot hanya mereplikasi tampilan point-in-time dari tabel menggunakan metode massal - perubahan inkremental tidak dilacak atau diterapkan. Replikasi transaksional bekerja dengan membaca catatan log dan menghasilkan transaksi yang sesuai untuk menerapkan perubahan pada pelanggan. Menggabungkan perubahan trek replikasi menggunakan pemicu dan tabel metadata.
Bacaan terkait: Mengoptimalkan kueri T-SQL yang mengubah data
sumber