MSSQL Server’da En çok I/O Yapan Tablo ve Data Dosyaları

Veritabanı performans sorunlarının temelinde genellikle disk alt yapısındaki gecikmeler (latency) yatar. SQL Server, veriye erişim ve log yazma süreçlerinde diske bağımlı olduğundan, I/O operasyonlarının izlenmesi sistem sağlığı için kritiktir. Bu makalede, SQL Server üzerinde en çok I/O yükü oluşturan tabloları ve disk dosyalarını nasıl tespit edebileceğimizi inceleyeceğiz.

Tablo Bazlı I/O Kullanımı

Performans optimizasyonuna başlarken, hangi tabloların en çok işlem gördüğünü bilmek gerekir. Özellikle user_scans (tablo taramaları) değerinin yüksek olması, eksik indekslerin veya verimsiz sorguların habercisi olabilir.

Aşağıdaki sorgu, veritabanında en çok okuma ve yazma yükü oluşturan ilk 10 tabloyu listeler:

SELECT TOP 10 
    OBJECT_NAME(s.object_id) AS TableName,
    i.name AS IndexName,
    user_seeks, user_scans, user_lookups, user_updates
FROM sys.dm_db_index_usage_stats AS s
JOIN sys.indexes AS i ON i.object_id = s.object_id AND i.index_id = s.index_id
WHERE database_id = DB_ID()
ORDER BY user_scans DESC;

Veri Dosyalarında Disk Gecikmesi (Latency) Tespiti

Sistemin genel yavaşlığı bazen belirli bir veri dosyasından kaynaklanabilir. sys.dm_io_virtual_file_stats DMV’si (Dynamic Management View), dosyalar üzerindeki bekleme sürelerini analiz etmemize olanak tanır.

Hangi veritabanı dosyasının ortalama yazma süresinin (AvgWriteMs) yüksek olduğunu görmek için şu yapı kullanılır:

SELECT 
    DB_NAME(vfs.database_id) AS DbName,
    mf.physical_name,
    vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, 0) AS AvgWriteMs
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN sys.master_files AS mf ON vfs.database_id = mf.database_id AND vfs.file_id = mf.file_id
ORDER BY AvgWriteMs DESC;

SQL Server’da bir dosyanın yazma hızı düştüğünde, bu durum tüm sistemi etkileyen bir zincirleme reaksiyona neden olabilir. En yüksek AvgWriteMs değerine sahip dosya, genellikle WRITELOG sorunlarının yaşandığı ana noktadır.

Hangi dosyada spesifik bir I/O sorunu olduğunu detaylıca görmek için:

SELECT 
    DB_NAME(mf.database_id) AS DbName,
    mf.physical_name,
    vfs.num_of_writes,
    vfs.io_stall_write_ms,
    vfs.io_stall_write_ms / NULLIF(vfs.num_of_writes, 0) AS AvgWriteMs
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS vfs
JOIN sys.master_files AS mf 
  ON mf.database_id = vfs.database_id AND mf.file_id = vfs.file_id
ORDER BY AvgWriteMs DESC;

Yukarıda kod parçasının analizi sonrasında aşağıdaki üç bekleme türünün (Wait Types) aynı anda görülmesi, sistemin I/O-Bound (disk kapasitesine takılmış) olduğunu kanıtlar:

Bekleme TürüAçıklama
WRITELOGSQL Server’ın işlem kayıtlarını (log) diske yazarken beklediğini ifade eder. Genellikle yavaş disk hızı veya yoğun transaction yükü ile ilgilidir.
ASYNC_NETWORK_IOSQL Server veriyi hazırladı ancak istemci (uygulama tarafı) bu veriyi yeterince hızlı çekemiyor. Ağ sorunlarına veya uygulama kodundaki verimsizliğe işaret eder.
PAGEIOLATCHVerinin diskten belleğe okunması sırasında oluşan gecikmedir. Eksik indeksler veya yetersiz RAM miktarı nedeniyle diske aşırı yüklenildiğini gösterir.

Eğer sisteminizde bu üç değer yüksekse, disk alt yapınızı gözden geçirmeli, indeks stratejinizi optimize etmeli veya veri dosyalarını daha hızlı storage birimlerine (örneğin NVMe SSD) taşımayı değerlendirmelisiniz.

Başka makalede görüşmek dileğiyle..

Ey iman edenler, sabırla ve namazla yardım dileyin. Gerçekten Allah, sabredenlerle beraberdir. Bakara Suresi, 153. Ayet

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir