Ana içeriğe atla

SQL Server Sorgu İyileştirme Çalışması

Performans Ölçüm Kriterleri

Bu makale ile SQL Server üzerinde çalışan query'lerin optimize edilmesi için gerekli olan ilk aşama maddeleri ve çözümleri işlenmektedir. Veritabanı üzerinde koşan sorguların optimize edilmesi bu maddeler ile sınırlı olmayıp ayrı bir başlık altında incelenmektedir. Bu makale  konu hakkında sağlam bir temel ve ön fikir edinmek isteyenler için güzel bir kaynak olacaktır.

SQL Server üzerinde çalışmakta olan bir sorgunun performans iyileştirme işlemleri için ilk etapta dikkat ve kontrol edilmesi gereken bazı maddeler vardır. 

Performans Analizi Kontrol Maddeleri

1.      İlgili T-SQL çalıştırılmadan önce Time ve IO İstatistikleri ON Mode'a alınmalıdır.

Bu istatistiklerin açılması ile çalışan T-SQL'in çalışma süresinin detayı(CPU ve Other Time) ve sorguda çalışan tablolar üzerindeki IO istatistiklerinin detayı tespit edilebilir duruma gelmektedir.

SET STATISTICS TIME ON
SET STATISTICS IO ON
SELECT c.CustomerID, SUM(LineTotal)
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
JOIN Sales.Customer c ON oh.CustomerID=c.CustomerID
GROUP BY c.CustomerID


Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 2, read-ahead reads 1213, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 57, physical reads 1, read-ahead reads 55, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Customer'. Scan count 1, logical reads 123, physical reads 1, read-ahead reads 121, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 156 ms,  elapsed time = 339 ms.



2.      T-SQL için Execution Plan kontrol edilmelidir.


Execution Plan ile çalıştırılacak olan T-SQL'in akış diyagramı ve cost-optimized dağılımı göstermektedir. T-SQL'in hangi adımlardan geçtiğini ve ne kadar toplam cost'un yüzde kaçını oluşturduğu bilgisi temin edilir. Aşağıda örnek bir Execution Plan gösterilmiştir.

Bir Execution Plan'ı okumak için dikkat edilmesi gereken 2 madde vardır.

·         Akış diyagramı sağdan sola doğru okunmaktadır.
·         Akış diyagramı yukarıdan aşağıya doğru okunmaktadır.



Performans İyileştirme

İyileştirme Çalışmaları

İyileştirme çalışmalarına başlamadan önce ilk olarak istatistik bilgilerini ON mode'a getirip sorgu çalıştırılır ve sonucunda tablo&IO dağılımı ve tamamlanma süresi görüntülenir.

SET STATISTICS TIME ON
SET STATISTICS IO ON
SELECT c.CustomerID, SUM(LineTotal)
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
JOIN Sales.Customer c ON oh.CustomerID=c.CustomerID
GROUP BY c.CustomerID


Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 2, read-ahead reads 1213, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 57, physical reads 1, read-ahead reads 55, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Customer'. Scan count 1, logical reads 123, physical reads 1, read-ahead reads 121, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 156 ms,  elapsed time = 339 ms.




Daha sonraki adımda sorgu incelendiğinde sorguda kullanılan gereksiz tabloların olduğu tespit edildi. Bu nedenle sorgudan gereksiz ve kullanılmaya 2 tablo çıkarıldı. Bu işlemden sonra tekrar istatistik bilgileri ile sorgunun IO ve çalışma süresi bilgileri temin edildi ve iyileşme olduğu gözlemlendi.

SET STATISTICS TIME ON
SET STATISTICS IO ON

SELECT c.CustomerID, SUM(LineTotal)
FROM Sales.SalesOrderDetail od
JOIN Sales.SalesOrderHeader oh
ON od.SalesOrderID=oh.SalesOrderID
JOIN Sales.Customer c ON oh.CustomerID=c.CustomerID
GROUP BY c.CustomerID


Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 2, read-ahead reads 1130, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 57, physical reads 1, read-ahead reads 55, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Customer'. Scan count 1, logical reads 123, physical reads 1, read-ahead reads 121, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 141 ms,  elapsed time = 281 ms.




Üçüncü aşama olarak sorgunun kullandığı bazı alanlarda Index Scan işlemi yaptığı görüldü. Bu işlem çok fazla istenmeye bir işlem türüdür ve index eksiği olduğu anlamına gelir. Sorguda elde edilmek istenen iki alan için de index oluşturma işlemine gidilir. Composite Index metodu kullanılarak aşağıdaki şekilde indexleme yapılır. SalesOrderDetail tablosunda sorguda talep edilen ID ve TotalLine alanlarına index oluşturulmuştur. Daha sonrasında ise SalesOrderHeader tablosu içinde sorgudaki koşulları dikkate alarak bir index işlemi yapılmıştır. Index işlemi yapılırken sorgu yeterince analiz edilmeli ve sadece istenilen alanlar için index oluşturulmalı. Aşağıdaki komutlar ile index oluşturma işlemleri tamamlanır.  Bu işlemlerden sonra sorgu istatistiklerinin son hali komutları takip eden kısımda mevcuttur. %50 oranında bir iyileştirme sağlanmıştır.

CREATE INDEX IDX_OrderDetail_OrderID_TotalLine
ON Sales.SalesOrderDetail (SalesOrderID) INCLUDE (LineTotal)

CREATE INDEX IDX_OrderHeader_SalesOrderID_CustomerID
ON Sales.SalesOrderHeader (SalesOrderID, CustomerID)



Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 467, physical reads 1, read-ahead reads 472, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 57, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

 SQL Server Execution Times:
   CPU time = 62 ms,  elapsed time = 172 ms.




Yorumlar

Bu blogdaki popüler yayınlar

ASP.NET Core ile Visual Studio Code Ortamında Web API Geliştirmek

Merhaba Arkadaşlar, Önceki yazılarımızda MVC ile Web Programlama üzerine çalışmalar yapmıştık. Bu yazımda herkesin aklında bir fikir ve önbilgi oluşturmak adına MVC yapısından farklı olarak Web API konusuna giriş yapacağız. MVC yazılarına bu hafta devam etmedik çünkü MVC'ye devam ettikçe bazı kavramlar ve işlemler API ile daha kolay çözülebileceğini fark edeceksiniz. Bunu fark etmeniz için araya hem bir Web API yazısı koymuş olduk hem de .NET Core 2.0 ve Visual Studio Code ortamlarını tanımış olduk. Herşeyi ezbere bilmek zorunda değiliz ama en azından bazı kavramlar aklımızda yer etmeli bir önbilgimiz olmalı. Uzmanlığımız dışında bile olsa farklı konularda az da olsa bilgimiz olmalı ve gerektiğinde kendimizi farklı bir alanda diğer kişilerden daha hızlı uzmanlık kazanacak konuma getirmeliyiz :) Benim yorumlarım bu şekilde. Konumuza başlayacak olursak .NET Core nedir kısaca özetlemek gerekecek. Microsoft’un öncelikle IIS üzerinde PHP dosyalarının çalıştırılabilmesi daha

Python Değişkenler ve IF Kullanımı

Merhaba Arkadaşlar, Python Kurulumu işlemlerini tamamladıktan sonra artık python'da syntax kullanımı ve ufak çaplı modüler işlemler için hazırlıklar tamamlanmıştır. Python Kurulumu ve Bilgilendirme yazımızı kontrol etmediyseniz  https://selfarrival.blogspot.com.tr/2017/09/python-kullanm-avantajlar-ve-dogru.html   bu linke göz atabilirsiniz. Programlama dillerinde ilk aşamalar olarak, ilgili dilin syntax'ını kavramak amacıyla, temel programalama komutlarını yeni öğrenenilecek yazılım dilinde küçük örneklerle birlikte kullanılmaktadır. Bu yazımızda python üzerinde bu işlemler yapılacaktır. Python Değişkenler Python'da özel olarak bir değişken tipi tanımlanmaz. Yani birçoğumuzun alışık olduğu değişken tanımala tipinden farklıdır.  #Variables kısmında olduğu gibi değişken adı ve ilk etapta initialize edilecek value tanımlanmaktadır. #Variables PYTHON ile float ve integer tipindeki değişkenlerin toplanması ve ekrana bastırılması için gereken kod blo

ASP.NET MVC ile Entity Framework Kullanımı 3(Sum-Average-Top)

Merhaba Arkadaşlar, ASP.NET MVC ile Entity Framework kullanımı yazılarımıza devam ediyoruz. Geçen yazılarımızda Select ve Insert işlemlerini tanıtmıştık kısaca. Bu yazımızda ise,Entity Framework ile daha profesyonel ve advanced select operasyonları üzerinde çalışmalar yapacağız. Veritabanı üzerinde,iş biriminin istekleri basit select sorgusu ile olmayabiliyor. Bizden çekilen verilerin toplanması,ortalanmasının alınması ve ilk "x" kayıdın çekilmesini talep edebiliyorlar. Bu nedenle bu hafta Entity Framework ile Select operasyonlarında gruplama,sıralama ve top konularını inceleyeceğiz. Entity Framework İle Sum Kullanımı Bazen elde edilen verilerden toplam operasyonu gerekmektedir. Bu tarz durumlarda,SUM özelliğini kullanmaktayız. İlk etapta, GetTotalRate isminde integer değer geri veren bir fonksiyon oluşturduk. Daha sonrasında ise ToplamRate isimli değişkenimize EmployeePayHistories tablosunda Rate alanlarının toplam değerini hesaplatıp sonucu atadık. En s