SQL SERVER’DA VERİLERİ SAYFALAMAK

25 Mart 2011

by Halil İbrahim ARAÇ 27. Eylül 2009 21:57
 
Veritabanından gelen verileri listelediğiniz bir örnekte eğer gelen veri sayısı çok fazla ise sayfalama yapmanız gerekir. Aksi halde 10000 kayıtlık bir veri yığınını veritabanından bir seferde çekerek  DataGrid ile göstermeye çalıştığınızda bu sayfanın yüklenme süresi çok uzun olacaktır.
Bazılarımızın aklına şöyle bir soru gelebilir. Ben GridView’in sayfalama özelliğini etkinleştiririm ve her sayfada 10 kayıt görüntülerim. Bu sayede sayfanın yoğunluğunu azaltırım. Bu çoğu kişinin düştüğü bir yanlışlıktır. Çünkü GridView’in sayfalamasını etkinleştirseniz bile tüm veri veritabanından çekilecektir. Peki o halde tüm veri Grid’ e bağlandığı halde GridView sayfalamayı nasıl gerçekleştiriyor da sizin istediğiniz sayfa numarası aralığındaki veriyi görüntüleyebiliyor?
Siz GridView’e veriyi bağlandığınızda bağlanan tüm veri sayfa içerisinde Viewstate içerisinde saklanıyor ve başka bir sayfa için Grid’in sayfa numarasına tıkladığınızda ViewState PostBack ile sayfaya taşınıyor ve bu veri içerisinde istediğiniz aralıkta yer alan kayıt yığını görüntülenebiliyor.
Ancak bu 10000 verilik bir kayıt seti için bu 10000 satırın sayfa her pospback edildiğinde Viewstate ile taşınması demektir. Çünkü sizin tüm kayıtları çekmek için veritabanından yaptığınız SQL sorgulaması muhtemelen “select * from Sozler” şeklinde bir sorgudur ve bu sorgunun sonucunda da pek tabii Sozler tablosunda yer alan tüm sözler getirilecektir. Eğer Sozler tablosunda yer alan tüm kayıtları değil de bizim belirlediğimiz aralıktaki (örneğin 20 ve 30. kayıt arasındaki tüm kayıtlar) kayıtları getirebilirsek çok daha kullanışlı bir sorgu yazabilmiş oluruz ve o zaman yukarıda bahsettiğimiz Grid sayfalama problemini de çözebiliriz.
Aslında yukarıdaki satırları yazarken aklıma MySql veritabanı üzerinde sorgu yazdığım günler geldi. MySql sorgularında tam bu ihtiyacımızı karşılayabilen bir sorgu ifadesi mevcuttu. O da LIMIT komutuydu. Kullandığımız veritabanı yönetim sistemi MySql olsaydı  Sozler tablosunda yer alan kayıtların 1 ve 5. kayıtlar arasındaki verileri çekmek için “select * from Sozler orderby SozID LIMIT 1,5” sorgusunu kullanmamız yeterli olurdu. 5 ve 10. kayıtlar arasındaki verileri getirmek için “select * from Sozler orderby SozID LIMIT 5,10” ifadesi yeterli olacaktı. Gördüğünüz gibi MySql’de bu sorun çok kolay bir şekilde aşılabiliyordu. Size düşen sayfanın her postback olduğunda hangi sayfanın talep edildiğini öğrenmek ve bu LIMIT ifadesine sayfa numarasına bağlı olarak değişen bir değişkeni bağlayarak Grid’e bu sql ifadesin sonucunda gelen veriyi bağlamaktır.
Böyle bir ifadenin Sql Server’da karşılığının olmaması çok garip olurdu. Evet garip olurdu diyorum çünkü SqlServer da birçok kullanıcının yoğun olarak kullandığı bir veritabanı yönetim sistemidir.Geçenlerde bu konu üzerine araştırma yaparken bu işin Sql Server’da nasıl yapılacağı üzerine makaleler okuyordum ve ilginç bir SqlServer ifadesi buldum. Bu makalemde sizinle onu paylaşmak istedim. Örneğimde kullanacağım veritabanım SozlerDB isimli veritabanı olacak. Bu veritabanı Asenkron Web Servisi Çağrılması üzerine yazmış olduğum makalemde yer alan veritabanıdır.  Bu veritabanımın içerisinde Sozler isimli bir tablom var ve içerisinde özlü sözler kaydedilmiş durumda. Tablomun görüntüsü aşağıdaki gibidir.

RowNumber

Bize sayfalama imkanı sunan fonksiyonumuz ROW_NUMBER() isimli fonksiyondur. Bu fonksiyon her bir kaydın kaçıncı satırda olduğunu veren bir fonksiyondur. Örneğin her bir kaydın satır numarasını veren bir sorgu yazalım.

select ROW_NUMBER() OVER(ORDER BY SozID) AS RowNumber,* from Sozler

Sorguyu çalıştırdığımızda aşağıdaki çıktıyı elde ederiz.

Sql Server Sayfalama

Bu ekran görüntüsünden aslında ROW_NUMBER() fonksiyonun ne iş yaptığını anlamışsınızdır. Bu fonksiyon OVER ifadesi ile beraber çalışır ve OVER ile sıralamanın esas alınacağı kolonu belirtmeniz gerekir. Yukarıdaki sorguyu eğer aşağıdaki gibi yazarsak sonuç çok daha farklı olacaktır.


select ROW_NUMBER() OVER(ORDER BY SozID desc) AS RowNumber,* from Sozler

Sorgu sonucu aşağıdaki gibi olacaktır.

ROW_NUMBER()

Bu sefer OVER ifadesinde ID’ler tersten sıralandığı için satır numaraları da bu sıraya göre verilmiştir. İşte biz belirli bir aralıkta yer alan verileri sıralamak için bu RowNumber isimli kullanmaya çalışağız. Yani 3 ve 8. kayıtlar arasını getirebilmek için RowNumber kolonunun değeri 3 ve 5 arasında olanlar şeklinde bir şart koyacağız.
Daha esnek olması için biz bu değerleri dışarıdan parametre olarak alan bir prosedür yazmaya çalışalım.

CREATE proc [dbo].[VERIGETIR]
(
@bas int,
@son int
)
as
begin

with kayitseti as
(
      select ROW_NUMBER() OVER(ORDER BY SozID) AS 'RowNumber',* from Sozler
)

select * from kayitseti where RowNumber between @bas and @son

end

Bu prosedürü aşağıdaki değerlerle çalıştırdığınızda

exec VERIGETIR 3,8

Aşağıdaki sonucu elde edeceğiz.

OVER

Bu prosedürde önce RowNumber kolonunu içeren bir kayıtseti oluşturulmuş ve daha sonra bu kayıt seti içerisinde istediğimiz aralığı sorgulayan bir select ifadesi kullanılmıştır. Burada kayitseti dediğimiz veri kümesini aslında temp bir tablo gibi düşünebilirsiniz.
Yukarıdaki prosedürü aşağıdaki gibi de yazabilirsiniz.

ALTER proc [dbo].[VERIGETIR]
(
@bas int,
@son int
)
as
begin

select * from(SELECT ROW_NUMBER() OVER(ORDER BY SozID) AS RowNumber,* FROM Sozler) as kayitseti
where RowNumber between @bas and @son

end

Gene 3 ve 8 değerleri ile prosedürü çalıştırdığınızda aynı sonucu elde edeceksiniz. Bu sefer RowNumber kolonunu da içeren tüm veri kümesi as ifadesi ile bir kayıt seti olarak elde edilmiştir.
Böylece MySql’de yer alan LIMIT ifadesini karşılayacak bir prosedür yazmış olduk. Böylece bu prosedürü kullanarak verileri çeken bir Grid uygulamasında tüm veriyi değilde görüntülenecek olan sayfaya ait verileri veritabanından çekersiniz ki bu da ciddi bir performans artışı sağlayacaktır.
Bu makalemizin sonuna geldik. Başka makalelerde buluşmak dileğiyle hepinize iyi çalışmalar.

Örnek veritabanını indirmek için tıklayınız.(SozlerDB.bak (2,91 mb))

SQL Server 2008 de Otomatik BackUp için Job Oluşturma (Schedule)

15 Nisan 2010

SQL Server üzerinde bulunan Job (Schedule) mantığıyla bir çok işi otomatik olarak SQL Server a yaptırmak mümkün. Bu işlemlerden biride otomatik yedek aldırma. Örneğin bir job tasarlayıp her akşam gece 12.00 da database veya databaselerin yedeğini aldırabiliriz.

Örneğin, SQL Server 2008 üzerinde AdventureWorks databasenin otomatik yedeğini almak için bir job tasarlayalım.

Management Studio >> SQL Server Agent >> Jobs kısmına gelip sağ tık ile New job a geçelim.

sc1

General kısmında Name ve istediğiniz bir category i seçtikten sonra Steps kısmına geçiniz.

sc2

Steps kısmında bu job için uygulanacak adımlar tanımlanmaktadır. Yani burda birden fazla database in yedeklenmesini farklı adımlar olarak tanımlayabiliriz. Biz bu örneğimiz için sadece tek adım yani AdventureWorks ün yedeklenmesini tanımlayacağız.

Bunun için New butonuna basalım.

sc3

Resimde görüldüğü gibi alanları dolduralım. Command kısmında yazan yazı BackUp alma işlemini gerçekleştirecek T-SQL komutudur.

1 BACKUP DATABASE [AdventureWorks]
2 TO DISK = N'c:\\AdventureWorks.bak'

Gerekli alanların tamamını resimdeki gibi doldurduktan sonra OK e basıp arka ekranda Schedules kısmına gelelim.

sc4

Schedules bölümü job un hangi otomatik süreyle işleneceğinin belirleneceği bölümdür. Resimde de görmüş olduğunuz üzere günlük,haftalık,aylık istediğimiz gibi ayarlama yapabilmekteyiz. Biz bu örneğimizde sonucu hızlıca alabilmek açısından dakikada 1 seçeneğini ayarlıyoruz.

Resimde görüldüğü gibi alanları doldurduktan sonra OK e basıp arka ekranda Notifications kısmına geçelim.

sc5

Notifications kısmı, job görevini tamamladıktan sonra ilgili kişilere bilgi vermelerin ayarlandığı bölümdür. Ben bu örnek için işlem tamamlandığımda kendimi mail attırıyorum. Bu arada SQL Server 2008 de Mail Gönderme işlemi ile alakalı yazdığım yazıyı okumadıysanız okumanızı tavsiye ederim. Buradan erişebilirsiniz.

Notification larıda ayarladıktan sonra OK e basıyoruz. Job görevini almış durumda.:)

Bu arada ek bir bilgi vermek istiyorum. Bu jobların çalışabilmesi için SQL Server Agent in çalışır durumda olması gerekiyor. Bu bilgide aklınızda bulunsun.

Şimdi 3-4 dk kadar bekleyelim. Bu bekleme sırasında 3-4 defa BackUp işlemi gerçekleşecek ve mailler de mail kutumuza düşecektir.

Evet yeteri kadar bekledik. Mailimizi kontrol ettiğimizde BackUp Complete maillerinin gelmiş olduğunu görüyoruz.

sc6

sc7

Birde management studio üzerinde ki job un history sine bakalım. Bunun için Management Studio >> SQL Server Agent >> Jobs >> JobumuzunAdi kısmından sağ tık ile View History kısmını açalım.

sc8

Bu ekranda, oluşturduğumuz job un bütün tamamlanmış step history sine bakabilirsiniz.

Aklınıza takılan bir şey olursa yorum kısmından sorabilirsiniz.

İyi çalışmalar

Turgay Sahtiyan


...alıntıdır...