Veritabanı performans sorunlarının büyük bir çoğunluğu yetersiz bellek kaynaklarından veya belleğin yanlış yapılandırılmasından kaynaklanır. MSSQL Server, doğası gereği işletim sisteminden alabildiği kadar belleği rezerve etmeye çalışır. Ancak, sistemin genel sağlığını korumak için SQL Server’ın ne kadar harcadığını ve işletim sisteminde ne kadar boş yer kaldığını anlık değil, tarihsel (historical) olarak izlemek gerekir.
Anlık izleme araçları (Activity Monitor vb.) o anki durumu gösterir. Ancak dün gece saat 03:00’te sistem neden yavaşladı sorusuna cevap veremezler. Hazırladığımız MemoryUsage tablosu ve CaptureMemoryUsage prosedürü sayesinde:
- Trend Analizi: Bellek kullanımı zamanla artıyor mu?
- Darboğaz Tespiti: İşletim sisteminde RAM miktarı kritik seviyelere düşüyor mu?
- Kapasite Planlama: Mevcut donanım ne kadar süre daha yeterli olacak?
DBAMON veritabanı altında MemoryUsage tablosunu oluşturuyoruz:
USE [DBAMON]
GO
CREATE TABLE [dbo].[MemoryUsage](
[captureDate] [datetime] NOT NULL,
[sql_physical_memory_in_use_KB] [bigint] NULL,
[sql_physical_memory_in_use_GB] [int] NULL,
[system_total_physical_memory_KB] [bigint] NULL,
[system_total_physical_memory_GB] [int] NULL,
[system_available_physical_memory_KB] [bigint] NULL,
[system_available_physical_memory_GB] [int] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[MemoryUsage] ADD DEFAULT (getdate()) FOR [captureDate]
GO

Aşağıdaki prosedür, her çalıştığında o anki memory kullanım metriklerini hesaplamaktadır
USE [DBAMON]
GO
Create procedure [dbo].[CaptureMemoryUsage]
as
begin
BEGIN TRY
INSERT INTO [dbo].[MemoryUsage](
[sql_physical_memory_in_use_KB]
,[sql_physical_memory_in_use_GB]
,[system_total_physical_memory_KB]
,[system_total_physical_memory_GB]
,[system_available_physical_memory_KB]
,[system_available_physical_memory_GB])
SELECT
pm.physical_memory_in_use_kb AS sql_physical_memory_in_use_KB,
CEILING(pm.physical_memory_in_use_kb/1048576.0) AS sql_physical_memory_in_use_GB,
sm.total_physical_memory_kb AS system_total_physical_memory_KB,
CEILING(sm.total_physical_memory_kb/1048576.0) AS system_total_physical_memory_GB,
sm.available_physical_memory_kb AS system_available_physical_memory_KB ,
CEILING(sm.available_physical_memory_kb/1048576.0) AS system_available_physical_memory_GB
FROM sys.dm_os_process_memory AS pm
CROSS JOIN sys.dm_os_sys_memory AS sm ;
end try
begin catch
declare
@error_message nvarchar(4000),
@error_number int,
@error_state int,
@error_severity int,
@error_procedure nvarchar(126),
@error_line int
select @error_number = error_number()
, @error_state = error_state()
, @error_severity = error_severity()
, @error_procedure = error_procedure()
, @error_line = error_line()
set @error_message = left('CaptureMemoryUsage Error Message: ' + error_message(), 4000)
raiserror(700016, @error_severity, @error_state, @error_message)
exec [dbo].[Capture_Error] @error_message,
@error_number,
@error_state,
@error_severity,
@error_procedure,
@error_line
end catch
end;
Verilerin anlamlı olması için bu prosedürü bir SQL Server Agent Job aracılığıyla örneğin her 1 veya 5 dakikada bir çalışacak şekilde zamanlamalısınız. Bu sayede gün içindeki dalgalanmaları ve anlık işlemleri yakalayabilirsiniz.
EXECUTE [DBAMON].[dbo].[CaptureMemoryUsage];

İlgili tablomuza select çektiğimizde sonuçların başarılı bir şekilde geldiği görüşmektedir.

Yukarıda bulunan kolonların ne işe yaradığını değinelim:
| Kolon Adı | Açıklama |
| captureDate | Verinin kaydedildiği tarih ve saat. Analiz yaparken zaman eksenini oluşturur. |
| sql_physical_memory_in_use_KB | SQL Server’ın o an kullandığı toplam fiziksel bellek miktarıdır (KB cinsinden). |
| sql_physical_memory_in_use_GB | SQL Server’ın kullandığı belleğin GB’a yuvarlanmış halidir. (Örn: 1844 GB). |
| system_total_physical_memory_KB | Sunucuda takılı olan toplam fiziksel RAM miktarıdır (KB cinsinden). |
| system_total_physical_memory_GB | Sunucudaki toplam RAM’in GB cinsinden karşılığıdır. (Örn: 2048 GB yani 2TB). |
| system_available_physical_memory_KB | İşletim sisteminde o an boşta duran, kullanılabilir bellek miktarıdır (KB). |
| system_available_physical_memory_GB | İşletim sisteminde kalan boş yerin GB cinsinden karşılığıdır. (Örn: 157 GB). |
MSSQL Server’da Memory Kullanım Durumunu Tabloya Kaydetme işlemiyle artık herhangi bir sorun anında memory üzerinde nelerin sıkıntı yarattığını görmüş olacağız.
Başka makalede görüşmek dileğiyle..
Anne babaya kaba davranmayın İsra-23
