Fill factor, SQL Server in index yapilandirmasi üzerindeki bir özelliktir. Bu özellik sayesinde bir index olusturulurken;  SQL sayfasi içerisindeki her bir 8K datanin yüzde olarak ne kadarinin bos birakilabilecegini ayarlayabiliriz. Örnegin Fillfactor %90 olan bir index için SQL Server her bir sayfa için %10 bosluk birakacaktir. Bu bosluk yazma islemlerinde kullanilir.

Varsayilan olarak Fillfactor SQL Server üzerinde 0 dir (yani %100 dür). Bu en hizli okumaya göre ayarlanmistir ancak eger bir tabloya okuma isleminden çok yazma islemi yapiliyor ise bu durumda performans kaybi yasiyoruz demektir. Yani bu varsayilan Fillfactor ayari her zaman dogru degildir.

Neden?

Çünkü SQL Server su sekilde çalisiyor;

Öncelikle yazma islemi yapildiginda ve sayfa yer olmadigi için yeni bir sayfa olusturuluyor. Sonra Dolu olan sayfadaki verilerin yaklasik yarisi olusturulan bu yeni ve bos sayfaya tasiniyor. Eski sayfadaki verinin bozulmamasi için yarisinin yeni sayfaya tasindigi eski sayfada isaretleniyor ve son olarak sayfa adreslerine yeni sayfa eklendigine dair bir güncelleme yapiliyor.

Biraz kompleks ve ince ayarlar oldugu kesin, bu nedenle dikkatli hareket etmekte fayda var. FillFactor ün belli seviyeler altinda kalmasi daha ciddi performans sorunlarina yol açabilir. Fazladan olusan bosluklar hem diskin efektif kullanilmamasina hem de veri okuma alanlari uzayacagi için daha uzun süren okuma islemlerinden dolayi performans kayiplari yasanabilir.

Ne yapmali?

Önelikle hiç bir zaman varsayilan ayarlari tamami ile degistirmemeli. Sonrasinda indeksleri düzenlenecek tablolarda, indekslerde olusan bosluklara bakilarak gerekli olan yerlerde indeks bosluklari alinmalidir (REORGANIZE veya REBUILD komutlari kullanilabilir). Fillfactor için hangi degerin en uygun oldugu veritabani incelenerek anlasilir ancak bu deger %100 den ne kadar uzaklasir ise okuma zamaninda o kadar performans kaybi yasayabilirsiniz demektir. Benim öngörüm %95 varsayilan deger için uygun olabilecegi. %80 in altina inilmesini tehlikeli buluyorum.

Script from MSDN

 

USE AdventureWorks2012;
GO
/* Drops and re-creates the IX_Employee_OrganizationLevel_OrganizationNode index on the HumanResources.Employee table with a fill factor of 80.
*/

CREATE INDEX IX_Employee_OrganizationLevel_OrganizationNode ON HumanResources.Employee
   (OrganizationLevel, OrganizationNode) 
WITH (DROP_EXISTING = ON, FILLFACTOR = 80); 
GO

 

If you like this, follow my RSS channel!