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
Yorum Gönder