Aracılığıyla paylaş


Hayalet temizleme işlemi kılavuzu

Hayalet temizleme süreci, silinmek üzere işaretlenmiş sayfalardan kayıtları silen tek iş parçacıklı bir arka plan işlemidir. Aşağıdaki makalede bu işleme genel bir bakış sunulmaktadır.

Hayalet kayıtları

Dizin sayfasının yaprak düzeyinden silinen kayıtlar fiziksel olarak sayfa üzerinden kaldırılmaz; bunun yerine, kayıtlar 'silinecek' olarak işaretlenir veya hayaletlenir. Bu, satırın sayfada kaldığı ancak satırın gerçekten bir hayalet olduğunu belirtmek için satır üst bilgisinde biraz değiştirildiği anlamına gelir. Bunun amacı, silme işlemi sırasında performansı iyileştirmektir. Hayaletler satır düzeyi kilitleme için gereklidir, ancak satırların eski sürümlerini korumamız gereken anlık görüntü yalıtımı için de gereklidir.

Hayalet kayıt temizleme görevi

Silinmek üzere işaretlenen veya görünmez olarak kaydedilen kayıtlar, arka plan hayalet temizleme işlemi tarafından temizlenir. Bu arka plan işlemi, silme işlemi işlendikten sonra bir süre çalışır ve hayaletlenen kayıtları sayfalardan fiziksel olarak kaldırır. Hayalet temizleme işlemi otomatik olarak bir aralıkta (SQL Server 2012+ için 5 saniyede bir, SQL Server 2008/2008R2 için her 10 saniyede bir) çalışır ve herhangi bir sayfanın hayalet kayıtlarla işaretlenip işaretlenmediğini denetler. Herhangi birini bulursa, silinmek üzere işaretlenen veya hayalet olarak işaretlenen kayıtları silip her yürütmede en fazla 10 sayfaya dokunur.

Bir kayıt hayaletlendiğinde, veritabanı hayalet girişlere sahip olarak işaretlenir ve hayalet temizleme işlemi sadece bu veritabanlarını tarar. Hayalet temizleme işlemi, tüm hayalet kayıtlar silindikten sonra veritabanını 'hayaletli kayıt yok' olarak işaretler ve bir sonraki çalıştırma sırasında bu veritabanını atlar. İşlem, paylaşılan kilit alamadığı veritabanlarını da atlar ve bir sonraki çalıştırılışında yeniden dener.

Aşağıdaki sorgu, tek bir veritabanında kaç tane hayalet kaydın olduğunu bulabilir.

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

Hayalet temizlemeyi devre dışı bırak

Yüksek yüklü sistemlerde, çok sayıda silme işlemi olduğunda hayalet temizleme işlemi, sayfaları arabellek havuzunda tutarak ve giriş/çıkış işlemleri üreterek performans sorununa yol açabilir. Bu nedenle, izleme bayrağı 661 kullanımıyla bu işlemi devre dışı bırakmak mümkündür. Ancak, işlemin devre dışı bırakılmasının performans üzerindeki etkileri vardır.

Hayalet temizleme işlemini devre dışı bırakmak veritabanınızın gereksiz ölçüde büyümesine neden olabilir ve performans sorunlarına yol açabilir. Hayalet temizleme işlemi hayalet olarak işaretlenmiş kayıtları kaldırdığından, işlemin devre dışı bırakılması bu kayıtları sayfada bırakır ve SQL Server'ın bu alanı yeniden kullanmasını engeller. Bu, SQL Server'ı bunun yerine yeni sayfalara veri eklemeye zorlar ve bu da veritabanı dosyalarının kabarmasına neden olur ve sayfa bölmelerine neden olabilir. Sayfa bölmeleri, yürütme planları oluştururken ve tarama işlemleri yaparken performans sorunlarına yol açar.

Hayalet temizleme işlemi devre dışı bırakıldıktan sonra, hayalet kayıtları kaldırmak için bazı eylemler yapılması gerekir. Bir seçenek, verileri sayfalarda hareket ettirecek bir dizin yeniden derlemesi yürütmektir. Bir diğer seçenek de , sp_clean_db_free_space (tüm veritabanı veri dosyalarını temizlemek için) veya sp_clean_db_file_free_space (tek bir veritabanı veri dosyasını temizlemek için) el ile çalıştırmaktır; bu da hayalet kayıtları siler.

Uyarı

Hayalet temizleme işlemini devre dışı bırakmak genellikle önerilmez. Bunun yapılması, üretim ortamında kalıcı olarak uygulanmadan önce denetimli bir ortamda kapsamlı bir şekilde test edilmelidir.