Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Mitos Performa :Truncate Tidak Dapat Digulung Kembali

Penulis Tamu :Derik Hammer (@SQLHammer)


Perbedaan antara TRUNCATE TABLE dan DELETE sering disalahpahami. Saya berusaha untuk menyangkal mitos bahwa TRUNCATE TABLE tidak dapat dibatalkan:

“TRUNCATE TABLE tidak dicatat dan oleh karena itu tidak dapat dibatalkan. Anda harus menggunakan DELETE, jika dalam transaksi.”

Membaca manual

Artikel Buku Online di TRUNCATE TABLE cukup deskriptif:

“Menghapus semua baris dari tabel atau partisi tabel tertentu, tanpa mencatat penghapusan baris individual. TRUNCATE TABLE mirip dengan pernyataan DELETE tanpa klausa WHERE; namun, TRUNCATE TABLE lebih cepat dan menggunakan lebih sedikit sumber daya sistem dan log transaksi.”

Fakta bahwa TRUNCATE TABLE menggunakan lebih sedikit sumber daya log transaksi menyiratkan bahwa ia menulis ke log transaksi sampai tingkat tertentu. Mari kita cari tahu berapa banyak dan selidiki kemampuannya untuk digulung kembali.

Buktikan

Dalam posting sebelumnya, Paul Randal membahas ini dengan sangat detail, tetapi saya pikir akan berguna untuk memberikan repro yang sangat sederhana untuk menyangkal kedua elemen mitos ini.

Dapatkah TRUNCATE TABLE dikembalikan?

Membuktikan bahwa TRUNCATE TABLE dapat digulung kembali cukup mudah. Saya hanya akan memasukkan TRUNCATE TABLE dalam transaksi dan mengembalikannya.

USE demo;
BEGIN TRANSACTION;
  SELECT COUNT(*) [StartingTableRowCount] FROM [dbo].[Test];
  TRUNCATE TABLE [dbo].[Test];
  SELECT COUNT(*) [TableRowCountAfterTruncate] FROM [dbo].[Test];
ROLLBACK TRANSACTION;
SELECT COUNT(*) [TableRowCountAfterRollback] FROM [dbo].[Test];

Ada 100.000 baris dalam tabel dan kembali ke 100.000 baris setelah rollback:

Apakah TRUNCATE TABLE menulis ke log?

Dengan menjalankan CHECKPOINT, kita mendapatkan titik awal yang bersih. Kemudian kita dapat memeriksa catatan log sebelum dan sesudah TRUNCATE TABLE.

USE demo;
CHECKPOINT;
 
  SELECT COUNT(*) [StartingLogRowCount]
  FROM sys.fn_dblog (NULL, NULL);
 
  TRUNCATE TABLE [dbo].[Test];
 
  SELECT COUNT(*) [LogRowCountAfterTruncate]
  FROM sys.fn_dblog (NULL, NULL);

Perintah TRUNCATE TABLE kami menghasilkan 237 catatan log (setidaknya pada awalnya). Inilah yang memungkinkan kita untuk melakukan rollback, dan bagaimana SQL Server mendaftarkan perubahan untuk memulai.

Bagaimana dengan DELETE?

Jika DELETE dan TRUNCATE TABLE menulis ke log dan dapat dibatalkan, apa yang membuatnya berbeda?

Seperti disebutkan dalam referensi BOL di atas, TRUNCATE TABLE membutuhkan lebih sedikit sumber daya sistem dan log transaksi. Kami telah mengamati bahwa 237 catatan log ditulis untuk perintah TRUNCATE TABLE. Sekarang, mari kita lihat DELETE.

USE demo;
CHECKPOINT;
 
  SELECT COUNT(*) [StartingLogRowCount]
  FROM sys.fn_dblog (NULL, NULL);
 
  DELETE FROM [dbo].[Test];
 
  SELECT COUNT(*) [LogRowCountAfterDelete]
  FROM sys.fn_dblog (NULL, NULL);

Dengan lebih dari 440.000 catatan log yang ditulis untuk DELETE, perintah TRUNCATE jelas jauh lebih efisien.

Penutup

TRUNCATE TABLE adalah perintah yang dicatat dan dapat dibatalkan, dengan keunggulan kinerja yang sangat besar dibandingkan DELETE yang setara. DELETE menjadi penting ketika Anda ingin menghapus lebih sedikit baris daripada yang ada di tabel (karena TRUNCATE TABLE tidak menerima klausa WHERE). Untuk beberapa ide tentang membuat DELETE lebih efisien, lihat posting Aaron Bertrand, "Pecah operasi penghapusan besar menjadi beberapa bagian."

Tentang Penulis

Derik adalah MVP Platform Data Microsoft profesional data dan baru yang berfokus pada SQL Server. Kegemarannya berfokus pada ketersediaan tinggi, pemulihan bencana, integrasi berkelanjutan, dan pemeliharaan otomatis. Pengalamannya telah mencakup administrasi database jangka panjang, konsultasi, dan usaha wirausaha yang bekerja di industri keuangan dan perawatan kesehatan. Saat ini dia adalah Senior Database Administrator yang bertanggung jawab atas tim Database Operations di Subway Franchise World Headquarters. Ketika dia tidak aktif, atau blogging di SQLHammer.com, Derik mencurahkan waktunya untuk #sqlfamily sebagai pemimpin bab untuk grup pengguna SQL Server FairfieldPASS di Stamford, CT.

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apakah Kunci Kandidat dalam Desain Basis Data?

  2. Bagaimana tidak memanggil prosedur tersimpan yang dikompilasi secara asli Hekaton

  3. Menggunakan RStudio dengan Versi Non-Sistem dari Manajer Driver unixODBC

  4. Menghubungkan MS SQL ke IRI Workbench

  5. SQL IN vs SQL ADA