SQL Server – EXISTS ile TOP Kullanmak Performanslı Mı?

SQL Server‘da sorgularımızda sık kullandığımız bir komut olan EXISTS komutu ile alt sorgulardan gelen bir veri olup olmadığını (Not Exists) tespit etmemize imkan sağlar. Kullanımı IN komutuna benzer olmasına karşın daha esnek bir yapıya sahiptir.

SQL Server‘da Exists komutu ile birlikte TOP (1) komutunu da kullanırsak sorgumuz daha performanslı çalışır. Gerçekten de Exists komutu ile birlikte TOP kullanımı performans açısından bir fayda sağlıyor olabilir mi? Bu konuyu incelemek için birkaç örnek hazırladım ve analiz ettim. Gelin sonuçları karşılaştıralım. Örneklerimde Microsoft’un örnek veritabanı olan AdventureWorks veritabanını kullanıyorum.

İlk örneğimde çok basit olan sadece bir tablonun veritabanında olup olmadığı bilgisini veren bir sorguyu hem TOP (1) ile kullanarak hemde TOP kullanımı olmadan çalıştırıp sonuçları karşılaştırıyorum.

[sql]

IF EXISTS(SELECT 1 FROM Production.Product)
PRINT ‘Tablo Mevcut’

IF EXISTS(SELECT TOP(1) 1 FROM Production.Product)
PRINT ‘Tablo Mevcut’

[/sql]

Sorgunun çalışma planında herhangi bir değişiklik meydana gelmedi. Birde I/O değerlerini karşılaştıralım.

Top ile birlikte kullanılan Exists komutu ile Top komutu kullanılmayan arasında bir I/O değerinde bir fark meydana gelmedi. Biraz daha karmaşık bir sorgu ile deneyelim;

[sql]

IF EXISTS (
SELECT 1 FROM Production.Product P
WHERE P.Color Like ‘%B%’
GROUP BY Color
HAVING Count(*)>1
)
PRINT ‘Veri Bulunuyor…’

IF EXISTS (
SELECT TOP(1) 1 FROM Production.Product P
WHERE P.Color Like ‘%B%’
GROUP BY Color
HAVING Count(*)>1
)
PRINT ‘Veri Bulunuyor…’

[/sql]

Hımmm. Gelen sonuçlarda yine herhangi bir farklılık mevcut değil. Son olarak en sık kullanılan Exists yöntemiyle de deneyelim,

[sql]

SELECT * FROM Production.Product P
WHERE EXISTS (SELECT TOP(1) 1 FROM Sales.SalesOrderDetail SD WHERE SD.ProductID=P.ProductID)
SELECT * FROM Production.Product P
WHERE EXISTS (SELECT 1 FROM Sales.SalesOrderDetail SD WHERE SD.ProductID=P.ProductID)

[/sql]



Üç farklı örneğimizde de çalışma planı ve I/O değerlerinde herhangi bir fark meydana gelmedi. Yaygın olarak bilinenin aksine Exists ile birlikte TOP kullanımının sorgu performansına olumlu yada olumsuz herhangi bir etkisi bulunmamaktadır.

Sonuç olarak Exists operatörü mümkün olan en az bilgiyi almaya çalışır. Bu yüzden TOP(1) kullanmanızın sorgunuza sadece fazladan 6 karakter eklemeniz dışında bir etkisi olmayacaktır.

 

Mesut Güneş

Selçuk Üniversitesi Bilgisayar programcılığı bölümünden mezun olduktan sonra birçok firmada Yazılım, İş zekası ve Veritabanı Uzmanı olarak çalıştım. Şuan Türkiye’nin en büyük şirketlerinden biri olan Doğan Online’da Veritabanı Yöneticisi olarak çalışıyorum.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.