MSSQL Server’da Memory Performans Counter Değerlerini Tabloya Kaydetme

Bu makalede mssql server üzerinde bulunan gerekli memory değerlerini bir tabloya kaydetme işlemini görmüş olacağız. Daha sonra herhangi bir anda memory değerlerini sıkıntı anında görmüş olacağız. Bu sayede nelere odaklanmamız gerektiğini bulmuş olacağız. Öncelikle verinin ne kadar memory üzerinde kaldığını bulan page life expectancy değeri, memory üzerinde bekleme işleminin olup olmadığını kaydedeceğimiz Memory Grants Pending ile verinin memory üzerinde bulunma oranı olan Buffer Cache Hit Ratio yapısını bir tabloya kaydedip daha sonra tablo üzerinden takip işlemi yapmış olacağız. Büyük sistemlerde instance kontrol’ü yapıldıktan sonra komutun çalıştırılması gerekmektedir.

İlk olarak değerleri kaydedeceğimiz tablomuzu oluşturuyoruz. Tarih kolonu üzerinde index oluşturup bulmak istediğimiz tarih değerini bulabiliriz.

CREATE TABLE PageLifeBufferCachTable (
    [object_name] varchar(50),
    [counter_name] varchar(50),
    [PageLife/BufferCache] varchar(50),
	Tarih datetime
);

Daha sonra tek bir step içerisinde veya ayrı ayrı stepler içerisinde aşağıdaki kodu ekleyip bir job oluşturuyoruz. Bu job belirli aralıklarla bizlere page life expectancy, Memory Grants Pending ve Buffer Cache Hit Ratio oranını oluşturduğumuz tabloya kaydetme işlemini yapmış olacaktır.

Aşağıdaki komutta WAITFOR DELAY gecikmesiyle tablomuza yukarıda belirtilen 3 değeri kaydetme işlemini yapmış olacağız.

-- İlk insert
INSERT INTO PageLifeBufferCachTable (object_name, counter_name, [PageLife/BufferCache],Tarih)
SELECT
    [object_name],
    [counter_name],
   [cntr_value],
   getdate()
FROM
    sys.dm_os_performance_counters
WHERE
    [object_name] LIKE '%Buffer Manager%'
    AND [counter_name] = 'Page life expectancy';

	WAITFOR DELAY '00:00:02'

-- İkinci insert
INSERT INTO PageLifeBufferCachTable (object_name, counter_name, [PageLife/BufferCache],Tarih)
	SELECT
	 a.[object_name],
	  'Buffer Cache Hit Ratio (%)' AS counter_name,
    (a.[cntr_value] * 100.0 / b.[cntr_value]),
   getdate()
FROM
    sys.dm_os_performance_counters AS a
JOIN
    sys.dm_os_performance_counters AS b
ON
    a.[object_name] = b.[object_name]
WHERE
    a.counter_name = 'Buffer cache hit ratio'
    AND b.counter_name = 'Buffer cache hit ratio base'

WAITFOR DELAY '00:00:02'

-- Ücüncü insert
INSERT INTO PageLifeBufferCachTable (object_name, counter_name, [PageLife/BufferCache],Tarih)
SELECT
[object_name],
[counter_name],
[cntr_value],
getdate()
FROM sys.dm_os_performance_counters
WHERE [counter_name] = 'Memory Grants Pending';

Yukarıda belirtilen job’ımızı oluşturduktan sonra ayrı bir stepte yada ilgili jobın son adımında silme işlemini yapmamız gerekmektedir. Tablomuzun şişmesini önlemek için yapılmaktadır.

DELETE FROM dbo.PageLifeBufferCachTable WHERE Tarih< DATEADD(DAY, -30, GETDATE());

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

Author: Yunus YÜCEL

Bir yanıt yazın

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