SELECT İfadelerinin Mantıksal İşlem Sırası – Bölüm 6

T-SQL, programlama dili olmasının yanı sıra bir yönüyle alışılmışın dışındadır. T-SQL’de, bir ifadenin yazıldığı sırayla veri tabanı motorunun bu ifadeyi işlediği işlem sırası aynı değildir. Veri tabanı motorları bir sorgunun yürütülmesini optimize edebilmekte ve bunu sonucun doğruluğunu (mantıksal sıranın belirlediği şekilde) koruyarak yapabilmektedir. Bir nevi, işlemlerin mantıksal sırası öğrenilmez ise sorguları yazarken hem kavramsal hem de pratikte engellerle karşılaşabiliriz. Bu bölümde bir SELECT ifadesinin unsurlarını tanıyacak, ifadelerin çalıştırılma sırasını öğrenecek ve sonra bu anlayışı sorgu yazarken pratik bir yaklaşımla uygulamaya dökeceğiz.

SELECT İfadesinin Öğeleri

İşlemlerin mantıksal sırasını anlamak için isteğe bağlı bir dizi eleman da dahil olmak üzere bir SELECT ifadesine bütünsel bakmanız gerekir. Bu arada bu bölümde bu unsurların her biri hakkında ayrıntılı bilgi verilmeyecektir, SELECT ifadesinin her bir kısmı sonraki bölümlerde tartışılacaktır.

Bir SELECT ifadesi zorunlu ve isteğe bağlı unsurlardan oluşur. SQL Server’ın hatasız bir şekilde yürütme işlemi yapması için yalnızca bir SELECT ifadesi yeterlidir. SELECT tek başına FROM deyimi olmadan da bir satırlı sanal bir tablodan seçim yapıyormuşçasına çalışabilmektedir. Bu bölümde değişkenleri test ederken bu olayın örneğini göreceğiz. Ayrıca SELECT ifadesi, FROM olmadan bir tablodan veri alamadığından tek başına SELECT ifadeleri bu bölümle alakası olmayan özel bir durum olarak değerlendiriniz. Şimdi de SELECT ifadesindeki elemanların rollerini ve SQL Server tarafından değerlendirildikleri sırayı inceleyelim.

Mantıksal Sorgu İşleme

Bir SELECT ifadesinin yazıldığı sıra ile SQL Server Database Engine tarafından değerlendirilip işlendiği sıralama aynı değildir.

Aşağıdaki sorguya bir göz atalım:

USE TSQL;
SELECT EmployeeId, YEAR(OrderDate) AS
OrderYear
FROM Sales.Orders
WHERE CustomerId = 71
GROUP BY EmployeeId, YEAR(OrderDate)
HAVING COUNT(*) > 1
ORDER BY EmployeeId, OrderYear;

İşlemlerin çalışma sırasını incelemeden önce sorgunun ne yaptığını kısaca gözden geçirelim. İlk satır, sorgu için doğru veri tabanına bağlanmanızı sağlar.

Gerekirse ana SELECT sorgusu yürütülmeden önce veritabanına bağlanma işlemini tamamlamanız gerekir:

Veri tabanı Bağlantısını Değiştirmek

USE TSQL; — bağlanılan veri tabanını 'TSQL' isimli veri tabanına değiştir.

SELECT ifadesi EmployeeId sütununu döndürür ve OrderDate sütunundan sadece yıl değerini alır:

Select’in başlangıcı

SELECT EmployeeId, YEAR(OrderDate) AS OrderYear

FROM deyimi, sorgu için hangi tablon satır kaynağı olduğunu tanımlar. Bu sorguda Sales.Orders tablosudur:

From ifadesi

FROM Sales.Orders

WHERE ifadesi, Sales.Orders tablosunun dışındaki satırları filtreler ve yalnızca predicate’i sağlayanları tutar; bu durumda, ID’si 71 olan bir müşteri şu şekilde belirtilir:

Where ifadesi

WHERE CustomerId = 71

GROUP BY ifadesi, kalan satırları EmployeeId ve sipariş yılı ile birlikte gruplandırır:

Group By ifadesi

GROUP BY EmployeeId, YEAR(OrderDate);

Gruplar oluşturuldu. Daha sonra HAVING deyimin de verilen şarta göre grupları filtreler. Yalnızca belirli bir yılda müşteri başına birden fazla satış yapan çalışanlar bu filtreyi geçecektir:

Having ifadesi

HAVING COUNT(*) > 1

Bu sorguyu önizlemek amacıyla, son kullanılan ORDER BY  ifadesi, çıktıyı alıp EmployeeID ve yıl sütun değerlerine göre sıralar.

ORDER BY EmployeeId, OrderYear;

Şimdi, her bir ögenin ne yaptığını anladığımıza göre, bunları SQL Server tarafından değerlendirilme sırasına bakalım:

  1. FROM deyimi, ifadenin geri kalanına kaynak satırları getirmesi için önce değerlendirilir. İlerleyen bölümlerde, FROM tümcesinde birden fazla tablonun nasıl birleştirileceğini göreceğiz. Sanal bir tablo oluşturulur ve bir sonraki adıma geçirilir.
  2. Sonra WHERE ifadesi değerlendirilir, FROM’dan kaynak tablodan gelen satırları, predicate ile eşleşenler/eşleşmeyenler şeklinde filtreler. Filtrelenmiş sanal tablo bir sonraki adıma geçirilir.
  3. Daha sonra GROUP BY, sanal tablodaki satırları GROUP BY listesinde bulunan benzersiz değerlere göre düzenler. Grup listesini içeren yeni bir sanal tablo oluşturulur ve bir sonraki adıma geçirilir.
  4. HAVING deyimi daha sonra değerlendirilir ve tüm grupları kendine verilen predicate değerine göre filtreler. Üçüncü adımdan gelen sanal tablo filtrelenir ve bir sonraki adıma geçirilir.
  5. Ve nihayet SELECT çalıştırılır, sorgu sonuçlarında hangi sütunların görüneceğini belirler.
  6. Son olarak ORDER BY ifadesi, satırları sütun listesinde belirlenen şekilde sıralar.

Örnek sorgumuzun mantıksal işlem sırası aşağıdaki gibidir, açıklık açısından en başa USE ifadesi dahil edilmemiştir:

Mantıksal İşlem Sırası

FROM Sales.Orders
WHERE CustomerId = 71
GROUP BY EmployeeId, YEAR(OrderDate)
HAVING COUNT(*) > 1
SELECT EmployeeId, YEAR(OrderDate) AS OrderYear
ORDER BY EmployeeId, OrderYear;

Görüldüğü üzere T-SQL sorgularını mantıksal olarak değerlendirildikleri sırayla yazamayız, fakat mantıksal işlem sırasını da görmüş olduk. Arka planda ne dönüyor bilmek önemlidir.

Mantıksal İşlem Sırasını SELECT İfadeleri Yazarken Uygulamak

Bir SELECT sorgusu işlendiğinde arka planda gerçekleşen işlemlerin mantıksal sırasını öğrendiğinize göre, bir sorgu yazarken aşağıdaki hususları göz önünde bulundurmanız gereklidir. Bunların bazıları sonraki yazılarda öğreneceğimiz ayrıntılara atıfta bulunmuştur:

  • Hangi tabloları ilk sırada sorgulayacağınıza karar verin ve FROM ifadesiyle belirleyin.
  • FROM ifadesindeki tablolardan hangi satırların ya da alt kümelerin alınacağına ve predicate’inizi nasıl ifade edeceğinizi belirtin. WHERE ifadesi bununla belirlenir.
  • Kayıtları gruplandırmayı düşünüyorsanız hangi sütunların gruplandırılacağına belirleyin. COUNT gibi aggregate fonksiyonlarına ek olarak, yalnızca GROUP BY ifadesindeki sütunlar en sonda SELECT ifadesine dahil edilebileceğini unutmayın.
  • Grupları filtreleyeceğiniz zaman predicate’inize karar verin ve HAVING ifadesini kullanın. Bu aşamanın sonuçları SELECT ifadesine input olarak iletilecektir.
  • GROUP BY kullanmıyorsanız kaynak tablolardan hangi sütunları görüntülemek istediğinizi belirleyin ve bu sütunlara başvurmak için oluşturduğunuz tablo takma adını kullanın. GROUP BY kullandıysanız, GROUP BY ifadesindeki sütunlardan birini seçin ve SELECT listesine başka toplamalar ekleyin.
  • Son olarak, kümelerin herhangi bir sıralama içermediğini unutmayın, gerekirse bir sıralama düzeni oluşturmak için ORDER BY kullanın.

Bir cevap yazın

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