Pengaturan Ghost Cleanup

10

Saya menjalankan database transaksional yang tinggi (rata-rata ~ 175k transaksi / Menit, hampir 9 juta catatan per jam ditambahkan dan dihapus)

Hingga baru-baru ini, ini belum terlalu menjadi masalah seperti yang kita alami ~ catatan 7,5M ditambahkan dan dihapus tetapi dengan masuknya data terbaru pembersihan hantu tampaknya tidak mampu mengimbangi pembersihan ruang yang tidak terpakai pada tabel / indeks.

Beberapa hari yang lalu kami mencapai 53 GB 'Unused Space' di 16 tabel (kebanyakan 2 dari mereka) sehingga hasilnya mulai mencari ke dalam proses pembersihan hantu untuk menemukannya berjalan setiap 5 detik sekali dan berjalan di lebih dari 10 halaman.

Solusi saya saat ini adalah pagi itu saya menjalankan tiga utas dari perintah berikut:

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

untuk mengejar ketinggalan dengan backlog dari malam sebelumnya (ketika sebagian besar penghapusan kami dilakukan)

Saya bertanya-tanya apakah ada cara untuk mengubah pengaturan default dari 5 detik dan 10 halaman untuk mengatakan setiap detik atau menjalankan lebih dari 20 halaman, apakah ada cara untuk melakukan itu atau haruskah saya terus hanya memutar beberapa prosa pembersihan untuk menghapus data, atau jika ada tindakan lain yang dapat membantu ini

Pengindeksan ulang berjalan pada sebagian besar indeks paling sedikit sekali seminggu (kebanyakan setiap hari)

SQL Server 2012 Enterprise SP3_CU8 (meningkatkan ke CU9 besok) di AlwaysOn High Availabilty Cluster juga dengan replikasi (distribusi pada server terpisah)

Ste Bov
sumber

Jawaban:

4

Saya ingin tahu apakah ada cara untuk mengubah pengaturan default dari 5 detik dan 10 halaman untuk mengatakan setiap detik atau melebihi 20 halaman

Tidak, tidak ada. Setidaknya saya tidak tahu sampai sekarang :-)

jika ada tindakan lain yang dapat membantu ini

Dari blog Paul Randal - Salah satu metode yang kadang-kadang dipertimbangkan orang adalah memaksa pembersihan hantu untuk membersihkan semuanya dengan melakukan pemindaian tabel atau indeks (dengan demikian mengantri semua catatan yang dihapus untuk tugas pembersihan hantu).

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

Apakah ada kemungkinan bagi Anda untuk mempartisi tabel dan membersihkan partisi yang lama alih-alih menghapus ? FYI .. SQL Server 2016 dan lebih tinggi memungkinkan Anda untuk memotong partisi individual juga.

Selain itu, Anda dapat (TEST dan mengimplementasikan) - menonaktifkan pembersihan hantu (jejak bendera 661) dan kemudian rebuild index WITH ONLINE = ONopsi karena Anda menggunakan edisi Enterprise.

Jika Anda menggunakan AlwaysON (dengan async) dengan replikasi, pastikan untuk mengaktifkan Trace flag 1448 - memungkinkan pembaca log replikasi untuk bergerak maju bahkan jika replika sekunder asinkron belum mengakui penerimaan perubahan.

Pastikan untuk membaca Hapus bahwa Halaman Terpisah dan Hantu Teruskan dari Paul White untuk melihat apakah tabel Anda memiliki pemicu atau kolom LOB yang akan melambat.

Kin Shah
sumber