SQL Server 2012'de Server-Side Sayfalama
SQL Server 2012 ile gelen yeni özelliklerden biri de server-side olarak sayfalama yapabilmektir. Sayfalama özelliği, SQL Server 2005/2008/2008 R2 üzerinde de gerçekleştirilebiliyordu. Bunun için ya ROW_NUMBER() fonksiyonunu CTE (Common Table Expression) içerisinde kullanarak ya da Sub-Query içerisinde kullanarak gerçekleştirebiliyorduk.
Sayfalama genellikle ASP.NET üzerinde ki Grid’i doldurmak için kullanılır. .NET code ‘u içerisinde bütün data’yı parse edip okumaktansa, server-side olarak SQL Server içerisinde yazacağımız bir stored procedure’ü çağırarak doldurmak herzaman için tercih edilen yol olmuştur. DBA olarak çekeceğimiz veriyi sayfalama yaparak okumak bize çok fazla bir artısı olmaz. Sadece bazı durumlarda, örneğin blok’lar halinde veri temizliği yapacağımız durumda veya bulk insert/update çalışmalarımızda kullanabileceğimiz bir metoddur.
Sayfalama da ROW_NUMBER() ‘ı kullanarak statik bir ID belirleriz. Belirlediğimiz ID’yi baz alarak ta sayfalamayı gerçekleştirmiş oluruz. SQL Server 2005 ‘ten SQL Server 2012 ‘ye kadar ROW_NUMBER() ile gerçekleştirdiğimiz server-side sayfalama’yı artık SQL Server 2012'te çok daha kolay ve dinamik şekilde yapıyoruz. SQL Server 2012'de karşımıza OFFSET/FETCH NEXT keyword’leri çıkıyor. OFFSET ‘te belirlenen sayı, satır sayısı demek oluyor. Yani ORDER BY xID OFFSET 5 ROWS dediğimizde gelen data’yı 5inci satırdan itibaren getiriyor. Eğer ek olarak FETCH NEXT 10 ROWS ONLY dersek 5inci satırdan itibaren 10 satırlık veriyi listelemiş oluyoruz.
Sayfalama özelliğini örneklerle SQL Server 2012 ve önceki sürümlerinde karşılaştıralım. Örnekleri AdventureWorks Database’i altında ki Contact tablosunda gerçekleştireceğim.
Sayfalamayı SQL Server 2005/2008/2008 R2 ‘de aşağıdaki şekilde kullanıyorduk.
USE AdventureWorks
GO
DECLARE @Sayfa SMALLINT
DECLARE @SatirSayisi SMALLINT
DECLARE @IlkKayit INT
DECLARE @SonKayit INT
SET @Sayfa = 1
SET @SatirSayisi = 5
SET @IlkKayit = ((@Sayfa - 1) * @SatirSayisi) + 1
SET @SonKayit = (@IlkKayit + @SatirSayisi) - 1
SELECT Contact.FirstName AS [Isim],
Contact.LastName AS [Soyad],
Contact.EmailAddress AS [E-Posta]
FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ContactID) AS RN
,FirstName
,LastName
,EmailAddress
FROM Person.Contact
) AS Contact
WHERE RN >= @IlkKayit
AND RN <= @SonKayit
Sorgu sonucunda aşağıdaki gibi çıktı alıyoruz.
SQL Server 2012'de ise aşağıdaki gibi yeni Keyword’lerimiz ile kullanımımızı gerçekleştiriyoruz.
USE AdventureWorks
GO
SELECT Contact.FirstName AS [Isim],
Contact.LastName AS [Soyad],
Contact.EmailAddress AS [E-Posta]
FROM Person.Contact AS Contact
ORDER BY ContactID OFFSET 0 ROWS
FETCH NEXT 5 ROWS ONLY
Sorgu sonucunda yine yukarı da aldığımız çıktıyı almış oluyoruz.
