SQL Server'da HEAP Fragmentasyonu nasıl azaltılır?


10

Geçenlerde bir yığın tablo% 70'den fazla parçalanma olduğunu öğrendim. Bu yüzden yapmaya karar verdim.

ALTER TABLE dbo.myTable REBUILD

Yeterince komik, daha sonra% 20 parçalanma yaşadım. O zamandan beri o masada yazı yoktu. Bu yüzden bir kez daha yeniden inşa etmeye karar verdim.

2. kez masa% 50 parçalanma çok daha fazla şapka ! Bunun nasıl olabileceğini gerçekten anlamıyorum ...


Mantıksal parçalanma söylerken ne demek istiyorsun. Veri sayfalarının kullanımı açısından parçalanmadır. Hiçbir düzen olmadığını biliyorum ama sırasız veriler kendi başına parçalanmadı. Bu durumda parçalanma, veri sayfalarının verimli kullanılması anlamına gelir.
smokinia

2
Sanırım sormalıyız, masa ne kadar büyük? Satırlarda ve sayfalarda.
Cody Konior

Yanıtlar:


17

Parçalanma Yığında Ne Demektir?

DMV'yi avg_fragmentation_in_percentsorgulayarak sütundan aldığınız Yığındaki parçalanma değeri sys.dm_db_index_physical_stats,

Dizinler için mantıksal parçalanma veya IN_ROW_DATA ayırma birimindeki yığınlar için kapsam parçalanması .

Ayrıca aynı BOL diyor ki:

Bu, bir yığının yaprak sayfalarındaki sıra dışı uzantıların yüzdesidir. Sıra dışı bir kapsam, bir yığın için geçerli sayfayı içeren kapsamın, bir önceki sayfayı içeren kapsamdan sonraki fiziksel kapsamdan sonraki boyuttur.

Ne olduğunu görebilirsiniz Yani Heap ayrılan sayfalarda boş alan mevcut değil ancak sayfaların değişen dizisi parçalanması oluşturur.

Bu küçük testlerle kanıtlanabilir. Bir Yığın Tablosu oluşturalım ve içine bazı kayıtlar ekleyelim ve sonra parçalanmayı kontrol edelim.

create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1   char(5000) Not null Default ('Heaps Are Cool')
)

SET NOCOUNT ON

Insert into dbo.Heaptest default values
go 50

select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')

Öyleyse, Yığın tablosu içinde 50 kayıt ile oluşturulur. DMV sys.dm_db_index_physical stats sorgusu sonrasında parçalanma nasıl görünüyor

resim açıklamasını buraya girin

avg_fragmentation_in_percentSütun değerinin% 33 olduğunu görebilirsiniz . Şimdi sayfaların nasıl düzenlendiğini görelim. Bu, belgesiz sorgu kullanılarak yapılabilir %%lockres%%. Sorgu,

SELECT  %%lockres%%, * FROM dbo.HeapTest;

Ve aşağıda çıktı nasıl görünüyor. Sadece ilgili kısmını takmak. Sorgu, dbo.HeapTest tablonuza 50 satır eklediğimizden beri 50 satır üretti.

resim açıklamasını buraya girin

Söylediği şey, ilk sayfanın kimliği 197, sonraki sayfanın kimliği, 242sonraki sayfaların sayfa kimliğine ulaşana kadar sürekli kimliğe sahip olmasıdır, 264çünkü bundan sonra sayfa kimliği alırız 280. Yani sayfa kimlik numaralarındaki bu sıçrama aslında parçalanmaya neden olan şeydir.

Şimdi öbeği yeniden inşa edelim ve çalıştıralım. Parçalanma elde ettik

resim açıklamasını buraya girin

Şimdi parçalanma olduğunu görebilirsiniz 14%.

Ayrılan sayfa numaralarını görelim

resim açıklamasını buraya girin

Tüm sayfalara seri olarak tahsis edilen tek bir atlama geri kalanımız var . Sadece bir sıçrama parçalanması önemli ölçüde azaldığı için.

Yığını yeniden inşa ediyorum ve şimdi parçalanmayı kontrol ettiğimde tamamen gitti. Ve sayfa kimliği ayırma

resim açıklamasını buraya girin

Parçalanma Neden Artırıldı

Şimdi, parçalanmanın yükselmesine neyin sebep olabileceğiyle ilgili olarak, sayfalar öbeğe ayrılırken sürekli olmayacaklardı, çünkü parçalanma değerinin artmasına neden olanın, sayfalara ayrılan SAYFA KİMLİĞİ'ndeki sıçrama olduğunu gördünüz.

Kafanın arkasında, HEAP için parçalanma kelimesinin herhangi bir anlamı olmadığını, sıralanmamış sayfalar için parçalanmayı nasıl tanımlayacağınızı da aklınızda bulundurmalısınız.

Parçalanma konusunda gerçekten endişeli

Gerçekten, yığın tablosunun parçalandığı ve sorguları yavaşlattığı bir senaryo ile karşılaşırsanız, tabloyu yeniden oluşturmaktan ziyade kümelenmiş bir dizin oluşturmak daha iyi olur. Nedeni öbek yeniden oluşturduğunuzda, altında yatan tüm kümelenmemiş dizinler de yeniden oluşturma işleminin çok daha uzun zaman almasına neden olur, çok fazla kaynak kullanır ve işlem günlüğü şişirir. Bir üretim sisteminde her zaman bundan kaçınmaya çalışır. Pavlus bunu Myth Bölümü'nde yığınla ilgili olarak ele aldı .

Not: Lütfen üretim sisteminde belgelenmemiş komut kullanmayın. Bu sadece gösteri içindi.


Ayrıntılı analiziniz için teşekkürler. Bazı veri kasası meraklıları Kümelenmiş Dizinler kullanmaktan daha iyi olduğunu düşündüğüm için büyük yığın tablolarıyla karşı karşıyayım, ancak bu durumda yığınların yararını görmüyorum, böylece bu yığınlarda gerçekten yığın kısıtlamaları ve kümelenmemiş dizinler kullanıyorum. Ancak ben sadece aptal geliştirici olduğum için ben bu başa çıkmak zorunda. Anlayışınız için tekrar teşekkürler :)
smokin

Sys.dm_db_index_physical_stats (db_id (), avg_page_space_used_in_percent, record_count komutunu sys.dm_db_index_physical_stats (db_id (), object_id ('dbo.HeapTest', 'U') 'yalnızca' varsayılan ',' varsayılan ',', ',' varsayılan ',', ',', ',', ',', ',' varsayılan ', nasıl çalışır bir tablo ? 'nesne_kimliği' içinde tablo adımı doğru olarak belirtsem bile tüm tablolardaki tüm dizinlerde döner
Mickael

@Mickael Geçerli veritabanını alacak olan db_id () işlevini kullandım ve özellikle her zaman geçerli veritabanına bakacak Heaptestve sonuç verecek ve sonuç verecek şekilde nesne adı verdim . Eminim bir şeyleri kaçırmış olabilirsiniz. Sadece uyumluluk düzeyinin 80 olmadığından emin olun, bu durumda db_id fonksiyonu çalışmaz
Shanky

@Shanky neden üretimde %% lockres %% sorgusuz sorgu kullanılmasını önermiyorsunuz? Ayrıntılı açıklar mısınız?
Ralph

@ user1624552 Belgelenmemiş olduğu için, MS'in bu konudaki belgeleri de güncel tutmadığı anlamına gelir. Etkilerinden sonra nasıl çalışır, hiçbir yerde belgelenmez, bu yüzden sorulur. Ex gizli zamanlayıcı oluşturur ve bu iyi değil fn_dump_dblog () komutu vardır . Bu komut da desteklenmiyor. Kullanabilirsiniz ama risk size aittir.
Shanky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.