29 Nisan 2012 Pazar

MS SQL 'de Pagging (Sayfalama)

Merhaba arkadaşlar.
Bazı durumlar vardır ki sql server 'da tablolarınıza "select" işlemi yaptığınızda, tablolarınızdaki kayıtların hepsinin gelmesini istemezsiniz. Çünkü bazı tablolarında milyon kayıt olabilir. Hele ki bir web uygulamasından bir server 'a veri erişimi yapmaya çalışıyorsam, bu milyon kaydı "select" etmek bile ölümdür arkadaşlar. Bu kayıtlarınızın hepsinin gelmesi hem çok yavaş gelecektir, hem de bu kadar veriyi bir anda incelemek pek işinize yaramayacaktır. İşte arkadaşlar bu durumlar için t-sql dilinde "Pagging" (sayfalama) yapılır. Paging işlemi, getirmek istenilen verilerin tamamının yerine belirli kısımlarının sayfa sayfa getirilmesi işlemidir.

Ben bu örneğimde sayfalama işlemini yapan bir fonksiyon tanımlayacağım. Böylece sayfalama işlemi için her seferinde kod yazmayacağım, fonksiyonumu istediğim yerde çağırabilirim. ayrıca bu fonksiyonum 2 parametre alsın: birincisi "select" ettiğim sayfamın kaç satırdan oluşmasını istediğimi, ikinci parametresinde ise kaçıncı sayfamı "select" etmek istediğimi belirtiyorum.

Dikkat etmemiz gereken nokta id 'ye göre sıralamamız gerektiğidır. İleride bir kayıt silindiğinde id numarasında bir atlama meydana geleceğinden dolayı o sayfada kayıt sayısı eksik olacaktır. İşte bu neden kendi sıra kolonumuzu oluşturmalıyız. Bunu oluştururken parametre vermeden "ROW_NUMBER" fonksiyonunu kullanacağız. Bu fonksiyon bize birer birer artan bir kolon oluşturur. Ama oluşturacağımız kolonumuzun tablodaki hangi kolona göre sıra takip ettiğini belirtmemiz gerekir. Bu işlemi de "OVER(ORDER BY ProductID)" kod satırı ile "OVER" fonksiyonunu kullanarak yapacağız. Böylece "ProductID" kolonunu referans alarak satırlar sıralanarak gelecektir. Normalde de bir tabloya "select" çektiğimde "ProductID" kolonuna göre sıralı geliyor.

CREATE FUNCTION PagingSample(@satirSayisi INT,@sayfaNo INT)
RETURNS TABLE
AS
RETURN
      SELECT *
      FROM
      (
            SELECT ROW_NUMBER() OVER(ORDER BY ProductID) AS RowNumProductId,ProductName FROM Products
      ) AS CC
      WHERE RowNum BETWEEN (@sayfaNo-1) * @satirSayisi+
      AND (@sayfaNo) * @satirSayisi

"PaggingSample" fonksiyonumu tanımladım. İstediğim satırdan oluşan istedğim sayfasını çağırabiliriz. Örneğin 6 satırlık 2.sayfayı çağıralım.
GO
SELECT * FROM PagingSample(6,2)

Görüldüğü üzere fonksiyonumuz sorunsuz bir şekilde çalışıyor arkadaşlar. Farklı değerler için bir kere daha çalıştıralım. 3 kayıttan oluşan 8. sayfayı getirelim.
GO
SELECT * FROM PagingSample(3,8)

Umarım yardımcı olabilmişimdir. Başka bir yazıda görüşmek dileğiyle, hoşçakalın...

2 yorum:

  1. Hic kullanmadigim paging 'i, sayende ogrendim, ama sorgudaki between kelimesinden sonraki carpma vs. islemleri ile ne yapildigini biraz aciklarsan uygulayicilara daha faydali hale gelir bence, paylasimin icin teskkurler.

    YanıtlaSil
  2. Yorumun için teşekkürler.. Biraz parametre isimlerine güvenmişim galiba :D Ama haklısın hesaplama işlemini açıklayabilirdim.

    YanıtlaSil