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 2017 CU3 Çıktı

Merhaba MastersOfSql Okuyucuları;

Tüm yazılımlarda olduğu gibi Microsoft da SQL Server için belli aralıklarla SP (Services Pack) veya CU (Cumulative Update) çıkartarak yaptığı düzenlemeleri yayınlıyor. SQL Server'ın tüm versiyonları için SP ve CU ları en hızlı bu site üzerinden takip edebilirsiniz.SQL Server Builds

SQL Server'ı en son versiyonu olan 2017 için de 4 Ocak 2018 de bir CU3 yayınlandı. Microsoft ekibinin bu CU da önemli bir uyarısı var! Hayatımıza renk katmış olan Query Store da tutulan tüm Execution Plan ların silinmesi gerektiğidir.


SET NOCOUNT ON;
DROP TABLE IF EXISTS #tmpUserDBs;

SELECT [database_id], 0 AS [IsDone]
INTO #tmpUserDBs
FROM master.sys.databases
WHERE [database_id] > 4
 AND [state] = 0 -- must be ONLINE
 AND is_read_only = 0 -- cannot be READ_ONLY
 AND [database_id] NOT IN (SELECT dr.database_id FROM sys.dm_hadr_database_replica_states dr -- Except all local Always On secondary replicas
  INNER JOIN sys.dm_hadr_availability_replica_states rs ON dr.group_id = rs.group_id
  INNER JOIN sys.databases d ON dr.database_id = d.database_id
  WHERE rs.role = 2 -- Is Secondary
   AND dr.is_local = 1
   AND rs.is_local = 1)

DECLARE @userDB sysname;

WHILE (SELECT COUNT([database_id]) FROM #tmpUserDBs WHERE [IsDone] = 0) > 0
BEGIN
 SELECT TOP 1 @userDB = DB_NAME([database_id]) FROM #tmpUserDBs WHERE [IsDone] = 0

 -- PRINT 'Working on database ' + @userDB

 EXEC ('USE [' + @userDB + '];
DECLARE @clearPlan bigint, @clearQry bigint;
IF EXISTS (SELECT [actual_state] FROM sys.database_query_store_options WHERE [actual_state] IN (1,2))
BEGIN
 IF EXISTS (SELECT plan_id FROM sys.query_store_plan WHERE engine_version = ''14.0.3008.27'')
 BEGIN
  DROP TABLE IF EXISTS #tmpclearPlans;

  SELECT plan_id, query_id, 0 AS [IsDone]
  INTO #tmpclearPlans
  FROM sys.query_store_plan WHERE engine_version = ''14.0.3008.27''

  WHILE (SELECT COUNT(plan_id) FROM #tmpclearPlans WHERE [IsDone] = 0) > 0
  BEGIN
   SELECT TOP 1 @clearPlan = plan_id, @clearQry = query_id FROM #tmpclearPlans WHERE [IsDone] = 0
   EXECUTE sys.sp_query_store_unforce_plan @clearQry, @clearPlan;
   EXECUTE sys.sp_query_store_remove_plan @clearPlan;

   UPDATE #tmpclearPlans
   SET [IsDone] = 1
   WHERE plan_id = @clearPlan AND query_id = @clearQry
  END;

  PRINT ''- Cleared possibly affected plans in database [' + @userDB + ']''
 END
 ELSE
 BEGIN
  PRINT ''- No affected plans in database [' + @userDB + ']''
 END
END
ELSE
BEGIN
 PRINT ''- Query Store not enabled in database [' + @userDB + ']''
END')
  UPDATE #tmpUserDBs
  SET [IsDone] = 1
  WHERE [database_id] = DB_ID(@userDB)
END

SQL Server 2017 CU3 de değişenleri görmek için tıklayınız.

Güzel haberlerde görüşmek üzere :) 

Çalışmalarımız devam ediyor

Merhaba MastersOfSql Okuyucuları;

Bildiğiniz üzere Galaksinin yaramaz ufaklığı Yoda güçle birleşti ve aramızda pek olmuyor bununla birlikte ara sıra ruhlar aleminden gelip buralar ne alemde diye bakıyor :):) bakarsınız eğitimine çok katkısı olmasa da ünlü şu sözüyle "Oldun sen bir Jedi şövalyesi olsun sana hayırlı uğurlu" diyerek Jedi lığını onayladığı "Luke Skywalker" da aramıza katılır :) artık geldiğinde Aydınlık tarafta mı yoksa Karanlık tarafta mı yazar bilemiyoruz onu zaman gösterecek ve belki de büyük sürpriz "zor zar :):) " ikna etmeye çalıştığımız büyük bir güç daha var O bir Prenses O bir BI ustası O bir ... 























Güzel haberlerde görüşmek üzere :) 

SQL Server IO Test

Sevgili MastersOfSQL severler, ilk yazımla sizlere merhaba demek istiyorum.

Nedir bu IO, input – giren, output’da çıkan data diyebiliriz. SQL Server’ınıza yazılan ve okunan dataların giriş ve çıkışlarını saniyede en fazla ne kadar yapabildiğini gösteren bir değerdir. Önemli midir? Evet önemlidir 😊

Neden önemlidir kısaca anlatmaya çalışalım. Storage veya disk alt yapınız, SQL Server’ınıza gelen çılgın SELECT cümlelerine cevap veremediği zaman IO sebebiyle beklemeler yaşarsınız. Tabiki burada hemen sorgularınızı gelişi güzel yazmamanız gerektiğini düşünmeye başlamanız gerekir.

Her bir SELECT sorgunuzun bir IO değeri olduğunu unutmayın, buna nasıl bakarım derseniz, sorgunuzun başına;

SET STATISTICS IO ON parametresini yazarak, sorgunuz çalıştıktan sonra ne kadar IO yaptığına dair değerleri görebilirsiniz.

Şimdi gelelim SQL Server sunucunuz üzerinde bu IO testleri nasıl yapılıyor bir bakalım. Daha önceden SQLIO adında bir program kullanıyorduk, Microsoft bunu DskSpd programı ile değiştirdi. Hem fiziksel hem de sanal makinalarda test için kullanılabilir.

Programı aşağıdaki linkten indiriyoruz;

https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223

Komut satırından çalışan bir programdır, bu yüzden direk C dizini altına DskSpd adında bir klasör açalım

C:\DskSPd

DiskSpd programı komut satırından çalışan bir program olduğundan, komut satırını yönetici olarak açmakta fayda var.

Ufak bir hatırlatma, SQL datalarınızın bulunduğu diskleri 64k unit size olarak formatlamayı unutmayın. Neden 64k formatlanıyor diye merak edenlere, başka bir makalede bunu anlatacağım.

DiskSpd’de kullanacağımız parametrelere göz atalım;

Örnek kod: DiskSpd.exe -c100G –d300 -r -w0 -t8 -o8 -b8K -h -L E:\testdosyasi.dat

-          c (Test dosyası boyutu 100 gb)

-          d (Test süresi 300 saniye)

-          r (Random IO, eğer r parametresi yazılmaz ise ardışık olarak testi yapar)

-          w (Testteki write yüzdesini belirler, w25 w50 gibi, w0 olarak bırakılırsa %100 read olarak test yapar)

-          t (Worker thread sayısını belirler, Core sayısına göre bu değeri değiştirmekte fayda var)

-          o (Outstanding’İn den kısaltmasını alıyor, her worker thread’e bağlı IO kuyruğu oluşturmak için kullanılıyor.

-          b (Blok size değeri veriliyor, her page 8kb olduğundan, 8kb veya 64k kullanılıyor)

-          h (İşletim sistemi seviyesinde ve donanım cachingi iptal etmek için kullanıyor, SQL server testinde bu parametre önemli)

-          L (test sırasındaki latency’i yakalıyor)

-          E:\testdosyasi (Test sırasında kullanılacak dosyanın yolunu belirtiyoruz, hangi disk biriminde test yapacaksanız ona göre değiştirmeniz gerekiyor)

Parametrelerden sonra yukardaki örnekte olan komutu çalıştıralım.


IO -1

3gb lık testfile oluşturmuştum, 8 thread üzerinde IO’ları ayrı ayrı gösteriyor, toplamda bu disk üzerinde %100 Read testinde Toplam Read IO’su 31.000 olarak çıktı.

Şimdi de %30 Write yapan bir test yapalım

DiskSpd.exe -c3G –d300 -r -w30 -t8 -o8 -b8K -h -L E:\testdosyasi.dat

Test ile bilgileri ilk olarak veriyor, software cache ve hardware write cache disable durumda. Read ve write değerleri, block size, random IO mu yoksa ardışık IO mu yapacağını Input parameters bölümünde görebilirsiniz. Bundaki amaç farklı parametreler kullanıp yapacağınız testleri kaydedip karşılaştırmak için kullanabilirsiniz.


IO -2

8 Corelu bir makinada bu testi yaptım, 8 thread olarak çalıştı, ve 300 saniye boyunca tüm Cpu’lar %100 olarak çalıştı, test sonuçlarının en başında Cpu yüzdelerini de görebiliyoruz. Eğer tüm cpular bu test sırasında çalışmıyor ise, thread kısmını kontrol etmelisiniz.


IO - 3

Şimdi read ve write IO larına baktığımızda, aslında bu disklerin toplam 30bin IO değeri verdiğini görüyoruz, thread ve test dosyası ile biraz daha oynasak bile, aşağı yukarı bu değerleri göreceğiz.


IO - 4

Son olarak da latency değerlerine bakalım, eğer sizde de bu kadar yüksek latency çıkıyorsa sotrage’inizde bir sorun vardır 😊 ben bu testi ssd’li bir laptopta yaptığımdan bu değerlerin çıkması gayet normal.



IO – 5

IO testlerimizi yaptık, storage’imizin ne kadar IO vereceğini artık biliyoruz, mevcut yapınızdaki durumu yukardaki testler ile artık görebileceksiniz. SQL Server’ınızın IO ları ile altyapınızın IO’larını karşılaştırıp, IO ihtiyacınız var mı yok mu tespit edebilirsiniz. Mevcut durum bu, peki yeni bir server ve storage alırken size kaç disk lazım olacak? Storage planlamasını neye göre yapıyorsunuz? Maalesef bu planlama ver abi ordan 20 disk, 2 de SSD takalım hız olur diyerek geçiştiriyorlar. Günün sonunda yanlış bir yatırımı kucağınızda buluyorsunuz 😊

Son paragraftaki soruların cevapları için bizi takip etmeye devam edin 😊 Storage planlaması hakkında daha bir makale yazacağım.

Obi-Wan Kenobi olarak ilk yazımda umarım faydalı olmuşumdur. Üstadın dediği gibi “Güç sizinle olsun”