Sepetiniz

Live Query Statitics ile Execution Plan’ı Sorgu Çalışırken Analiz Etmek

Live Query Statitics, SQL Server 2016 Management Studio ile gelen ama SQL Server 2014 veritabanlarında kullanılabilen bir özelliktir.

 

Öncesinde Execution Plan’ı iki şekilde alabiliyorduk.

 

Birincisi sorguyu çalıştırmadan Estimated Execution Plan’ı almak,

 

İkincisi sorgu çalışıp bittikten sonra Actual Execution Plan’ı almak.

 

Detayları “Execution Plan Nedir” isimli makalede bulabilirsiniz.

 

Live Query Statistics ile sorgunun çalışma anında henüz tamamlanmadan execution plan’ı alabiliyoruz.

 

Bu şekilde sorgunun çalışma sırasında hangi operatörden hangi operatöre geçtiğini anlık olarak görebiliyoruz. Operatör düzeyinde satır sayısını, çalışma süresini canlı olarak görebiliyoruz.

 

Özellikle problemli sorguları analiz ederken işimize yarayacağını düşünüyorum. Ayrıca Execution Plan’ı canlı bir şekilde ilerlediğini görmek gerçekten çok keyifli 🙂

 

Aşağıdaki gibi sorguyu çalıştırmadan önce Include Live Query Statistics dememiz gerekiyor.

Veritabanındaki Nesneler(Tablo,SP) In-Memory OLTP’ye Uygun Mu?(Migration Checklists)

SQL Server 2016 ile beraber gelen yeni Management Studio’ya veritabanındaki nesnelerin In-Memory OLTP’ye uygun olup olmadığını bize gösteren yeni bir özellik eklendi.

 

In-Memory OLTP hakkında daha detaylı bilgi almak için “In Memory OLTP Nedir? Ve Nasıl Kullanılır?” isimli makalemi okumanızı tavsiye ederim.

 

Aşağıdaki şeklide veritabanı üzerinde sağ tıklayarak Tasks ve Generate In-Memory OLTP Migration Checklists dememiz gerekiyor.

 

 

Karşımıza gelen ekranda Do not show this page again’i tıklıyoruz ve next diyerek ilerliyoruz.

 

Bir sonraki ekranda karşımıza aşağıdaki gibi 2 seçenek çıkıyor.

 

İlk seçeneği seçerek veritabanındaki tüm tablo ve stored procedure’ler için bu kontrolü yapabiliriz.

 

İkinci seçeneği seçerek de sadece belirlediğimiz tablo ve stored procedure’ler için bu kontrolü yapabiliriz.

 

Natively Compiled Scalar User-Defined Function(Udf) Nedir ve Nasıl Kullanılır?

Memory Optimized tablolar için SQL Server 2016 sürümünde Scalar User-Defined Function oluşturabiliyoruz. In Memory OLTP ve Memory Optimized Tablolar için “In Memory OLTP Nedir? Ve Nasıl Kullanılır?” isimli makalemi okumanızı öneririm.

 

Natively Compiled Scalar User-Defined Function’da fonksiyoniçindeki TSQL kodları daha iyi performans sağlayabilmek için native koda dönüştürülür.

 

Önceki makalemizde Memory Optimized Tablo’ların, Disk Based Tablolara göre performans olarak 5-30 kat daha iyi olduğunu söylemiştik. Memory Optimized Tabloları Natively Compiled Stored Procedure’le ve Natively Compiled Scalar User-Defined Function ile birlikte kullandığımızda bu fark daha da artıyor. Hızını görmek için test yapmanızı öneririm. Makalenin devamında gerekli kodu paylaşacağım.

 

Natively Compiled Stored Procedure Nedir ve Nasıl Kullanılır?” isimli makaleyi de okumak isteyebilirsiniz.

 

 

Aşağıdaki şekilde kullanabilirsiniz.

 

 

USE [Test]
GO

CREATE FUNCTION [dbo].[NativelyCompiledFunctionOrnek](@Deger int) RETURNS BIGINT WITH NATIVE_COMPILATION, SCHEMABINDING
AS
BEGIN ATOMIC WITH (TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'English')

DECLARE @sonuc BIGINT=0;
WHILE @Deger < 50000
BEGIN
SET @sonuc+=@Deger;
SET @Deger=@Deger+1;
END
RETURN @sonuc;
END

--Aşağıdaki şekilde çalıştırabilirsiniz
--DECLARE @sonuc BIGINT;
--SELECT @sonuc=dbo.NativelyCompiledFunctionOrnek (0)
--Select @sonuc;

 

Memory Optimized Tablolarda Otomatik İstatik Güncellemesi Aktif mi?

SQL Server 2016 ile Memory Optimized Tablolarda otomatik istatistik güncellemesi desteği geldi. Eğer veritabanı, compatibility level’i 130 olarak oluşturulduysa herhangi bir şey yapmak gerekmiyor. Ama veritabanı daha önceki bir compatibility level ile oluşturulduysa compatibility level’i 130’a çekildikten sonra istatistikleri manual olarak bir kere güncellemek gerekiyor.

 

Compatibility level ile ilgili “Compatibility Level Nedir Ve Nasıl Değiştirilir” isimli makale ilginizi çekebilir.

 

İstatistikler hakkında aşağıdaki makaleleri de okumanızı tavsiye ederim.

 

SQL Server’da İstatistik Kavramı ve Performansa Etkisi“,

UPDATE STATISTICS Nedir“,

DBCC SHOW_STATISTICS Nedir ve Nasıl Kullanılır

 

Veritabanında otomatik istatistik güncellemenin aktif olup olmadığını sorgulamanız gerekir. Aktif değilse aktif etmelisiniz. Veritabanı üzerinde sağ tıklayarak properties dedikten sonra options sekmesinden Auto Update Statistics’in True olup olmadığını görebilirsiniz.

 

ALTER DATABASE veritabanisminiz SET AUTO_UPDATE_STATISTICS ON;

 

 

Aşağıdaki script yardımıyla memory optimized tablolarda otomatik güncellemenin aktif olup olmadığını sorgulayabilirsiniz.

SELECT
    QUOTENAME(SCHEMA_NAME(tbl.schema_id)) + N'.' + QUOTENAME(tbl.name) AS [tablo_ismi],
    st.name AS [istatistik ismi],
    CASE  1-st.no_recompute
    WHEN 0 THEN 'HAYIR'
    WHEN 1 THEN 'EVET'
    END AS [otomatik güncelleme aktif mi?]
FROM sys.stats st JOIN sys.tables tbl ON st.object_id=tbl.object_id
WHERE tbl.is_memory_optimized=1

 

 

Eğer otomatik güncelleştirme kapalıysa manaul olarak istatistikleri güncellemek için aşağıdaki script’i kullanabilirsiniz. Sorgu size bir script verecektir. Bu script’i çalıştırmalısınız.

DECLARE @sorgu NVARCHAR(MAX) = N'';
SELECT
      @sorgu += N'UPDATE STATISTICS '
      + quotename(schema_name(tbl.schema_id))
      + N'.'
      + quotename(tbl.name)
      + ';' + CHAR(13) + CHAR(10)
   FROM sys.tables AS tbl
   WHERE tbl.is_memory_optimized = 1 AND
   tbl.object_id IN (SELECT object_id FROM sys.stats WHERE no_recompute=1)

SELECT @sorgu

 

 

Son olarak istatistik güncellennmesinden faydalanabilmesi için Natively compiled stored procedure’leri de manual olarak recompile etmelisiniz.

 

Incremental Statistics Nedir

SQL Server 2014 ile gelen bir özelliktir. Eğer veritabanınızda partition varsa çok işinize yarayabilir. Partition yoksa bir işinize yaramayacaktır. Auto Update Statistics’i True yaparsanız tablodaki satır değişikliği %20’yi geçtiğinde istatistikler güncelleniyordu. Auto Create Incremental Statistics’i True yaparsanız bu işlem partition bazında gerçekleşir. Büyük veritabanlarında istatistik güncelleme işlemini partition bazında yaparak istatistik güncellemenin sisteme getireceği yükü azaltabilirsiniz.

 

Aşağıdaki script yardımıyla veritabanı seviyesinde auto create incremental statistics’i true yapabilirsiniz. Bu işlemi gerçekleştirdikten sonra artık veritabanı seviyesinde partition yapılmış tablolarda yeni bir istatistik oluşacağı zaman incremental yapıda oluşacaktır.

ALTER DATABASE test
SET AUTO_CREATE_STATISTICS ON ( INCREMENTAL = ON )

 

 

Mevcut bir istatistiğin incremental yapıda olup olmadığını aşağıdaki sorgu yardımıyla öğrenebilirsiniz.

USE AdventureWorks2014Yeni
GO
SELECT
    OBJECT_NAME(object_id) TableName
   ,name
   ,is_incremental
   ,stats_id
FROM sys.stats
WHERE name = 'PK_EmployeeID'

 

 

Aşağıdaki script yardımıyla da bir istatistiği  partition bazında update edebilirsiniz.

 

 

UPDATE STATISTICS [VeritabaniAdi].[SemaAdi].[TabloAdi]
(IstatistikAdi) WITH RESAMPLE ON PARTITIONS(1)

 

 

Eğer istatistik incremental yapıda değilse aşağıdaki gibi hata alırsınız.

 

Msg 9111, Level 16, State 1, Line 13

UPDATE STATISTICS ON PARTITIONS syntax is not supported for non-incremental statistics.

 

Aşağıdaki script yardımıyla da mevcut bir istatistiği incremental yapıya geçirebilirsiniz.  Bu script’i çalıştırdıktan sonra artık yukardaki hatayı almadan partition yapılmış tablolardaki istatistiklerinizi partition bazında update edebileceksiniz.

 

UPDATE STATISTICS [EBYSDB].[dbo].[DocumentAttachment]
(IX_DocumentAttachment_DocumentId) WITH INCREMENTAL = ON

Veritabanındaki tüm partition yapılmış tablolardaki tüm istatistikler için yukardaki script’i veren script’i aşağıda bulabilirsiniz. Script’te AND tbl.name=’TabloIsmi’ kısmının başındaki – – işaretini kaldırıp TabloIsmi yerine bir tablo ismi yazarsanız sadece ilgili tablo için gerekli script’i çıkaracaktır.

 

SELECT DISTINCT 'UPDATE STATISTICS ' + QUOTENAME(object_name(s.object_id)) + ' (' + QUOTENAME(s.name) + ') WITH INCREMENTAL = ON'
FROM sys.tables tbl
INNER JOIN sys.indexes ind
ON tbl.object_id = ind.object_id
INNER JOIN sys.data_spaces ds
ON ind.data_space_id = ds.data_space_id
INNER JOIN sys.stats s
ON ind.object_id = s.object_id
WHERE ds.type = 'PS' --AND tbl.name='TabloIsmi'
AND s.is_incremental = 0

 

İstatistikler hakkında daha detaylı bilgi almak için “SQL Server’da İstatistik Kavramı ve Performansa Etkisi” isimli makaleyi okumanızı tavsiye ederim.

 

Bir istatistiğin verileri dağıtımı hakkında detaylı bilgi almak içinde “DBCC SHOW_STATISTICS Nedir ve Nasıl Kullanılır” isimli makaleyi okumanızı tavsiye ederim.