Bu makalede Mssql Server üzerinde row migration kavramının ne olduğunu görmüş olacağız. SQL Server’da row migration, bir tablodaki mevcut bir satırın boyutu büyüdüğünde, satırın artık bulunduğu data page’e sığamaması nedeniyle başka bir page’e taşınması (ya da kısmen taşınması) durumudur.
Herhangi bir satır UPDATE edilince güncelleme sonucu satırın boyutu artar. Mevcut 8 KB’lık data page içinde artık yer kalmaz. SQL Server satırı başka bir page’e taşır. Eski page’de ise yeni lokasyona işaret eden bir forwarding pointer bırakılır
Row migration teknik olarak normaldir ama fazla olursa performans düşer. bir satırı okumak için önce eski page’i sonra yeni page okunmaktadır. Bu işlem daha fazla logical read,IO ve sorguların geç dönmesine sebebiyet vermektedir.
Hangi durumlarda row migration oluşmaktadır. VARCHAR, NVARCHAR, VARBINARY gibi değişken uzunluklu kolonlarda görülmektedir. Sık sık UPDATE edilen tablolarda görülmektedir. Başta küçük veri girilip sonra büyüyen row’larda row migration görülmektedir.
Row migration ile row overflow farkı:
- Row migration: Satır başka bir page’e taşınır
- Row overflow: Satır aynı page’de kalır, ama büyük kolonlar ROW_OVERFLOW page’lerine taşınır
Row migration nasıl tespit edilmektedir.
SELECT
OBJECT_NAME(object_id) AS TableName,
forwarded_record_count
FROM sys.dm_db_index_physical_stats
(
DB_ID(), NULL, NULL, NULL, 'DETAILED'
)
WHERE forwarded_record_count > 0;
forwarded_record_count yüksekse row migration vardır. Heap tablolar üzerinde fragmentation alınacağı zamanda bu değere bakılmaktadır.
Row migration azaltmak istersek neler yapmamız gerekmektedir.
- Tabloyu REBUILD etmek
- Değişken uzunluklu kolonları sona almak
- Gerekenden büyük UPDATE’lerden kaçınmak
- Mümkünse fixed-length kolonlar kullanmak
- Çok problemliyse tabloyu clustered index’li hale getirmek, heap’lerde daha sık olur.
Bu makalede Row migration nedir konusuna değinmiş olduk. Başka makalede görüşmek dileğiyle..
“Mutlu olanlar ise cennettedirler.” (Hud, 11/108)
