Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Ghost cleanup adalah proses latar belakang yang secara fisik menghapus baris yang ditandai untuk dihapus oleh pernyataan DML. Artikel berikut ini memberikan gambaran umum tentang proses ini.
Baris hantu
Baris yang dihapus dari halaman tingkat daun indeks tidak dihapus secara fisik dari halaman. Sebaliknya, baris ditandai untuk penghapusan di masa mendatang, atau digabungkan. Ini berarti bahwa baris tetap berada di halaman tetapi sedikit diubah di header baris untuk menunjukkan bahwa baris adalah hantu. Hal ini berguna untuk mengoptimalkan performa selama operasi penghapusan. Hantu diperlukan untuk penguncian tingkat baris dan untuk transaksi isolasi rekam jepret di mana mesin database harus mempertahankan versi baris yang lebih lama.
Tugas pembersihan hantu
Baris yang ditandai untuk penghapusan, atau dihantui, dibersihkan oleh proses pembersihan hantu latar belakang saat tidak lagi diperlukan. Pembersihan hantu berjalan secara berkala dan memeriksa untuk melihat apakah ada halaman yang memiliki baris hantu. Jika ditemukan, baris ini akan dihapus secara fisik. Ada satu utas pembersihan hantu untuk semua database pada instans Database Engine.
Ketika baris menjadi hantu, database ditandai sebagai memiliki entri hantu. Proses pembersihan hantu hanya memindai database tersebut. Proses pembersihan ghost juga menandai database sebagai tidak memiliki baris hantu setelah semua baris ghost dihapus, dan melewati database ini saat proses dijalankan berikutnya. Proses ini juga melewati database apa pun jika tidak dapat memperoleh kunci bersama pada database. Ini mencoba kembali akuisisi kunci pada database saat berikutnya dijalankan.
Kueri berikut mengembalikan perkiraan jumlah baris "ghosted" (baris yang telah dihapus tetapi masih ada dalam indeks) dalam database.
SELECT SUM(ghost_record_count) AS total_ghost_records,
DB_NAME(database_id) AS database_name
FROM sys.dm_db_index_physical_stats(NULL, NULL, NULL, NULL, 'SAMPLED')
GROUP BY database_id
ORDER BY total_ghost_records DESC;
Menonaktifkan pembersihan hantu
Dalam sistem beban tinggi dengan banyak penghapusan, proses pembersihan hantu dapat mengurangi performa jika menggantikan banyak halaman yang sering diakses di kumpulan buffer dengan halaman lain yang memiliki baris hantu. Akibatnya, halaman yang sering diakses harus dibaca ulang dari disk, menghasilkan I/O disk tambahan dan meningkatkan latensi kueri. Jika ini terjadi, Anda dapat menonaktifkan pembersihan hantu menggunakan bendera pelacakan 661.
Tanpa pembersihan hantu, database Anda dapat tumbuh tidak perlu besar, yang juga dapat mengurangi performa karena I/O tambahan dan konsumsi memori. Karena proses pembersihan hantu menghapus baris yang ditandai sebagai hantu, menonaktifkan proses ini menyisakan baris ini di halaman, menghalangi mesin basis data untuk menggunakan kembali ruang tersebut. Ini memaksa mesin database untuk menambahkan data ke halaman baru sebagai gantinya, yang mengarah ke file database yang kembung, dan juga dapat menyebabkan pemisahan halaman. Pemisahan halaman meningkatkan I/O disk, yang dapat mengurangi performa kueri. Jika pembersihan hantu dinonaktifkan, database mungkin kehabisan ruang.
Peringatan
Menonaktifkan proses pembersihan hantu secara permanen tidak disarankan.
Untuk menghapus baris hantu saat pembersihan hantu dinonaktifkan, bangun ulang indeks pada tabel tempat baris dihapus. Menyusun ulang indeks membuat halaman baru dari data yang ada, mengabaikan baris terselubung dalam proses.