Masters Of SQL

SQL Server ile ilgili bilgiler, hayata dair paylaşımlar ve birazda eğlence tabii...
Deadlock’sız, Blocking’siz, Contention’sız günler diliyoruz :)
Sysadmin sizinle olsun

SQL Server Page Life Expectancy (PLE) Nedir?

Merhaba MastersOfSQL okuyucuları,


Query Query nereye kadar? demiştik en son herhalde :) buna o kadar inanmışız ki Biz bile yazmayı bırakıp hayatın güzelliklerine dalmışız hatta Padawan'ım Jedi'lik yolunda ilk adımlarını attı Kendisini buradan da kutluyorum.


Padawan'ım la geçen yine şiddetli bir şekilde SQL konuşurken :):) nedir bu PLE diye bir soru sordum? Kendisine yakışan bir şekilde tıkır tıkır (kimin öğrencisi) cevaplar versede baktım ki bu konu tam siteye yazmalık :).


Evet Page Life Expectancy kısaca PLE diyeceğiz kendisine. DBA ler için önemli bir performans counter değeridir peki ne işe yarar daha doğrusu neyi gösterir. PLE page'lerin memory üzerinde tutulma zamanını saniye cinsinden gösterir, sorgu sonucunda aldığınız değerin 300 den büyük olması beklentidir eğer sonuç 300 ve altındaysa burada bakmanız gereken 5dk boyunca alt sınırda olup olmadığıdır counter değeri bu kadar uzun süre alt değerde seyrediyorsa birazdan anlatacağımız sıkıntılara bakmanız gerekecektir.

Tüm performance counter lar için

select * from sys.dm_os_performance_counters

PLE'nin bir performance counter olduğundan bahsetmiştik aşağıdaki sorgu sonucuyla rahatlıkla bu değer ulaşabiliriz.


SELECT 	[object_name],
		[counter_name],
		[cntr_value] 
FROM sys.dm_os_performance_counters
WHERE 
[object_name] LIKE '%Manager%' AND 
[counter_name] = 'Page life expectancy'

Sorgu sonucunda PLE değerimizin 682881 saniye olduğunu görüyoruz. uuuuuuu Her genç DBA in rüyası :):):)

Sorgu sonucunda PLE değerimizin 283 saniye olduğunu görüyoruz. Sebebine bakacağız :)

Biraz daha detaylı bir sorgu yapalım bu rakamları şimdi böl, çarp zor olacak.

SELECT  
	@@servername AS INSTANCE
	,[object_name]
	,[counter_name]
	, UPTIME_MIN = CASE WHEN[counter_name]= 'Page life expectancy'
		      THEN (SELECT DATEDIFF(MI, MAX(login_time),GETDATE())
			  FROM   master.sys.sysprocesses
			  WHERE  cmd='LAZY WRITER')
		ELSE ''
END
	,[cntr_value] AS PLE_SECS
	,[cntr_value]/ 60 AS PLE_MINS
	,[cntr_value]/ 3600 AS PLE_HOURS
	,[cntr_value]/ 86400 AS PLE_DAYS
FROM  sys.dm_os_performance_counters
WHERE   [object_name] LIKE '%Manager%'
    AND [counter_name] = 'Page life expectancy'

Biraz daha okunaklı oldu.

PLE verisini izleyebilmek için bir job yapıp SQL tarafında kayıt altına alabileceğiniz gibi Windows içrisinde bulunan PerfMon'u kullanarak da izleyebilirsiniz.

Çeşitli counterlar eklenmiş bir PerfMon görüntüsü.

Gelelim counter değeri 300 civarlarındaysa nelere bakacağımıza.

  • SQL Server sunucusunun MaxMemory ayarı yapılmamış olabilir. SQL Server config ayarları için tıklayınız.
  • Sisteminizde bolca AD-Hoc query kullanılıyor olabilir. SP (Stored Procedure) ye geçiş yapmanız sistemi rahatlatabilir.
  • Yüksek Execution Plan oluşturan sorgularınız olabilir. Sistem analizi yapıp query leri parçalamanız çözüm olabilir.
  • Index bakımı yapılmamış olabilir
    - Drop Unused Indexes
    - Merge Duplicate Indexes
    - Index Maintenance 
    - Defrag (Rebuild, reorganize)
    - Statistics
  • Sorgularınız çok fazla re-compile oluyordur.
  • Çok büyük boyutlu datanız vardır. Data arşiv çalışması yapabilirsiniz 
  • RAM'iniz gerçekten yetmiyordur:):). Sistem yöneticilerinden RAM talebinde bulunabilirsiniz.


Sevgili SQL ve Performans severler :) uzun bir ardan sonra yazmak zorda olsa bu yazımızında sonuna geldik. Okurken zevk almanız dileğiyle topu Padawan'ıma atıyorum bir güzelce yazı da kendisinden bekliyoruz değil mi?



SQL Server - Best Practices

Performans & Optimizasyon

SQL Server üzerinde best practice olarak ayarlamamız gereken ayarları zaman zaman paylaşacağım ilk olarak yeni kurduğumuz bir SQL Server sunucusunda yapmamız gereken ayarlardan bahsediyor olacağım.
SQL Server konfigurasyonları içerisinde kritik olan "Server Properties" ekranından ve "sp_configure" den ayarlayabileceğimiz ayarlar aşağıda.

    USE master
    GO
    -- Öncelikle advanced options'ları açıyoruz
    EXEC sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE WITH OVERRIDE;
    GO

    -- Gerekli ayarları kontrol ediyoruz
    SELECT name, value, value_in_use, [description] 
    FROM sys.configurations
    WHERE name IN 
    (
    'backup compression default', -- 1 yapılmalı özellikle Backup süreleri ve storage den kazanç çok yüksek
    'clr enabled', -- clr enabled (only enable if it is needed)
    'Database Mail XPs', -- SQL üzerinden mail atıyorsak 1 yapılmalı
    'max degree of parallelism', -- OLTP sunucularında 1 yapılmalı.
    'max server memory (MB)', -- SQL Server RAM sever :) bu yüzden uygun ayarları OS a göre ayarlamak gerekir
    'min server memory (MB)', -- RAM optimizasyonu geniş bir konudur; min değerini ayarlamak yararlı demek tam doğru olamıyor analiz etmeden verilen bir değer OS çökmesine sebep olabilir.
    'optimize for ad hoc workloads', -- AdHoc query kullanan yerler ve Memory kısıtlı olan yerlerde "1"
    'xp_cmdshell' -- özellikle "0" olmalı sistem tarafında büyük bir açık oluşturuyor.
    )
    ORDER BY name 
    


Mevcut ayarlarımızı gördük artık ayarlamamız gereken değerler kaldı.

    USE master
    GO
    sp_configure 'show advanced options', 1;
    GO
    RECONFIGURE WITH OVERRIDE;;
    GO

    EXEC sys.sp_configure N'backup compression default', N'1'
    GO
    RECONFIGURE WITH OVERRIDE
    GO
 
    sp_configure 'max server memory', 20000; -- RAM miktarını kontrol ederek yapmamız gerektiğini unutmayalım.
    GO
    RECONFIGURE  WITH OVERRIDE;
    GO

    sp_configure 'min server memory', 0;
    GO
    RECONFIGURE  WITH OVERRIDE;
    GO

    sp_configure 'clr enabled', 1;
    GO
    RECONFIGURE  WITH OVERRIDE;
    GO 

    sp_configure 'max degree of parallelism', 1;
    GO
    RECONFIGURE  WITH OVERRIDE;
    GO 

    sp_configure 'optimize for ad hoc workloads', 1;
    GO
    RECONFIGURE  WITH OVERRIDE;
    GO 

    -- xp_cmdshell configure
    EXEC sys.sp_configure N'xp_cmdshell',N'0' -- yazılımı ekibinin kullandığı program olabilir !!!!!! sorup yapılmalı
    GO
    RECONFIGURE WITH OVERRIDE
    GO

    sp_configure 'show advanced options', 0;
    GO
    RECONFIGURE WITH OVERRIDE;;
    GO
    


RAM ayarları ne olacak diye soracak olursanız; ideal oranları tam vermek mümkün olmasa da yaklaşık alttaki değerleri ayarlıyorum bununla birlikte altta verdiğim değerler 64 bit (x64) işletim sistemleri için ve SADECE sunucuda SQL Server çalışıyorsa geçerlidir.

Physical RAM MaxServerMem Setting
2GB 1500
4GB 3200
6GB 4800
8GB 6400
12GB 10000
16GB 13500
24GB 21500
32GB 29000
48GB 44000
64GB 60000
72GB 68000
96GB 92000
128GB 124000

Bir yazımızın daha sonuna geldik. OS'e RAM bırakmanız gerektiğini unutmayın performansınızın düşmemesi dileğiyle :):)