Panduan proses pembersihan hantu

Proses pembersihan hantu adalah proses latar belakang berulir tunggal yang menghapus rekaman dari halaman yang telah ditandai untuk dihapus. Artikel berikut ini memberikan gambaran umum tentang proses ini.

Rekaman hantu

Rekaman yang dihapus dari tingkat daun halaman indeks tidak dihapus secara fisik dari halaman - sebagai gantinya, rekaman ditandai sebagai 'akan dihapus', atau dihantui. Ini berarti bahwa baris tetap berada di halaman tetapi sedikit diubah di header baris untuk menunjukkan bahwa baris benar-benar hantu. Ini untuk mengoptimalkan performa selama operasi penghapusan. Hantu diperlukan untuk penguncian tingkat baris, tetapi juga diperlukan untuk isolasi rekam jepret di mana kita perlu mempertahankan versi baris yang lebih lama.

Tugas pembersihan rekaman hantu

Rekaman yang ditandai untuk penghapusan, atau dihantui, dibersihkan oleh proses pembersihan hantu latar belakang. Proses latar belakang ini berjalan beberapa saat setelah transaksi penghapusan dilakukan, dan secara fisik menghapus rekaman hantu dari halaman. Proses pembersihan hantu berjalan secara otomatis pada interval (setiap 5 detik untuk SQL Server 2012+, setiap 10 detik untuk SQL Server 2008/2008R2) dan memeriksa untuk melihat apakah ada halaman yang ditandai dengan catatan hantu. Jika ditemukan, rekaman akan berjalan dan menghapus rekaman yang ditandai untuk dihapus, atau dihantui, menyentuh paling banyak 10 halaman dengan setiap eksekusi.

Ketika rekaman dihantui, database ditandai sebagai memiliki entri hantu, dan proses pembersihan hantu hanya akan memindai database tersebut. Proses pembersihan hantu juga akan menandai database sebagai 'tidak memiliki catatan hantu' setelah semua rekaman hantu dihapus, dan itu akan melewati database ini saat berikutnya dijalankan. Proses ini juga akan melewati database apa pun yang tidak dapat diambil kunci bersamanya, dan akan mencoba lagi saat berikutnya dijalankan.

Kueri di bawah ini dapat mengidentifikasi berapa banyak rekaman hantu yang ada dalam satu database.

SELECT sum(ghost_record_count) total_ghost_records, db_name(database_id) 
FROM sys.dm_db_index_physical_stats (NULL, NULL, NULL, NULL, 'SAMPLED')
group by database_id
order by total_ghost_records desc

Nonaktifkan pembersihan hantu

Pada sistem beban tinggi dengan banyak penghapusan, proses pembersihan hantu dapat menyebabkan masalah performa dari menjaga halaman di kumpulan buffer dan menghasilkan IO. Dengan demikian, dimungkinkan untuk menonaktifkan proses ini dengan penggunaan bendera pelacakan 661. Namun, ada implikasi performa dari menonaktifkan proses.

Menonaktifkan proses pembersihan hantu dapat menyebabkan database Anda tumbuh tidak perlu besar dan dapat menyebabkan masalah performa. Karena proses pembersihan hantu menghapus rekaman yang ditandai sebagai hantu, menonaktifkan proses akan meninggalkan rekaman ini di halaman, mencegah SQL Server menggunakan kembali ruang ini. Ini memaksa SQL Server untuk menambahkan data ke halaman baru sebagai gantinya, yang mengarah ke file database yang kembung, dan juga dapat menyebabkan pemisahan halaman. Pemisahan halaman menyebabkan masalah performa saat membuat rencana eksekusi, dan saat melakukan operasi pemindaian.

Setelah proses pembersihan hantu dinonaktifkan, beberapa tindakan perlu diambil untuk menghapus catatan hantu. Salah satu opsinya adalah menjalankan pembangunan ulang indeks, yang akan memindahkan data di sekitar halaman. Opsi lain adalah menjalankan sp_clean_db_free_space secara manual (untuk membersihkan semua file data database) atau sp_clean_db_file_free_space (untuk membersihkan datafile database tunggal), yang akan menghapus rekaman hantu.

Peringatan

Menonaktifkan proses pembersihan hantu umumnya tidak disarankan. Melakukannya harus diuji secara menyeluruh di lingkungan yang terkontrol sebelum diimplementasikan secara permanen di lingkungan produksi.

Langkah berikutnya

Menonaktifkan proses pembersihan hantu
Menghapus rekaman hantu dari satu file database
Menghapus rekaman hantu dari semua file data database