Ana Sayfa
Forumlar
Blog
Hakkımızda
Yükleniyor. Lütfen bekleyin ...
Kategoriler
ASP.NET
ADO.NET
Visual Basic .NET
Visual C# .NET
Visual Studio ve Araçlar
Windows Server System
Office System
.NET Framework
SQL Server
XML Web Servisleri
Yazılım Güvenliği
Yazılım Mühendisliği
Mobil Teknolojileri
Dynamics
Smart Client
Expression Studio
Silverlight
Kod Parçaları
Açık Kaynak Kodlu Uygulamalar
İş Zekası
Windows Mobile Embedded
0
Çıkış Yap
Üyelik Bilgilerimi Güncelle
Seminerlerim
Favorilerim
Ajanım
Yazgeliştir
Yazar olmak ister misiniz?
Forumlar
Kitap Önerileri
Haberler
Röportajlar
Yazarlar
İpuçları
Görüşleriniz
Hakkımızda
İstatistikler
En son kayıt olan üye:
ftonak
Şuanki online üyeler (
6
) :
ftonak
,
fatihbilmuh
,
SilahSor1907
,
modali2008
,
v3npa_
,
tayfunatas
SQL Server Kategorisi
»
Cursor' lar hakkında dikkat edilmesi gereken birkaç husus
Cursor' lar hakkında dikkat edilmesi gereken birkaç husus
Print Versiyonu
Yazar:
Ekrem Önsoy
Tarih:23.06.2008
Puan:
4,5
(Oy Kullanan:
2
)
Okuma Sayısı:
206
Makaleyi İşaretle
Makale Özeti
Bu yazımda Cursor' ların ne olduğunu anlatmaktan ziyade, Cursor' lar konusunda neye dikkat edilmesi gerektiğini ve Cursor' lar hakkında bir kaç ipucunu sizlerle paylaşacağım. Yani Cursor' ların neden ve nasıl kullanıldığını en azından basit seviyede de olsa bildiğinizi farzediyorum.
Makale
Merhabalar,
Bu yazımda Cursor' ların ne olduğunu anlatmaktan ziyade, Cursor' lar konusunda neye dikkat edilmesi gerektiğini ve Cursor' lar hakkında bir kaç ipucunu sizlerle paylaşacağım. Yani Cursor' ların neden ve nasıl kullanıldığını en azından basit seviyede de olsa bildiğinizi farzediyorum.
Cursor' ları kullanırken iyi düşünüp taşınmak, alternatiflerine bakmak ve eğer başka seçenek bulunamazsa kullanmak gerekir. Çünkü Cursor ile yapılan işlerin bir çoğu, diğer alternatiflerle de yapılabilmektedir. Bu yazımda bu alternatiflere değinmeyeceğim, ama en azından başlık olarak şunları sayabilirim: CASE, WHILE, tek satır döndüren SELECT sorguları. Kullanabildiğinizde Cursor yerine bu alternatifleri kullanmaya çalışın. Çünkü çoğu durumda Cursor' ların performansı, bu alternatiflerinin performansından daha düşük olacaktır.
Cursor' ların Kapatılması ve Hafızadan Kaldırılması
Cursor' lar konusunda dikkati edilmesi gereken bir husus ise, Cursor' ları bir Funtion veya SP içinde kullandıktan sonra kapatıp hafızadan silmektir. Bu işlemler için Cursor işleminin sonuna "
CLOSE <Cursor_adı>
" ve hemen altında da "
DEALLOCATE <Cursor_adı>
" komutları konmalıdır. CLOSE komutu tek başına yeterli değildir, çünkü sadece kilitlerin (lock) kalkmasını sağlar. Cursor' ı hafızadan temizleyen komut ise DEALLOCATE' tir. DEALLOCATE ile hafızadan kaldırılmamış bir Cursor, hafızayı işgal etmeye devam eder.
Hazıfadan kaldırılmamış Cursor' ları, SQL Server 2005' teki "
SELECT
*
FROM
sys.dm_exec_cursors(0)" komutu ile belirleyip, CLOSE ve DEALLOCATE komutlarıyla kapatıp hafızadan silebilirsiniz.
Performans
Daha iyi bir Cursor performansı için, sadece gerekli alanları ve satırları sorgulamalısınız. Meselâ aşağıdaki örnek, çoğu durum için oldukça kötü bir örnektir.
DECLARE
cur_Personel_Listesi
CURSOR FOR SELECT
*
FROM
DBO.PERSONEL
Kötüdür, çünkü tüm alanları getirmekle kalmıyor, aynı zamanda da herhangi bir WHERE şartı kullanarak veritabanından dönecek olan kayıtları da sınırlamıyor. Bunun sonucu ise, çok daha fazla hafıza sarfiyatı olacaktır.
Eş Zamanlı Kullanım (Concurrency)
Eğer oluşturacağınız CURSOR ile herhangi bir kaydı değiştirmeyecekseniz, o zaman CURSOR' ın READ_ONLY seçeneğini de belirtmelisiniz. Bu, herhangi bir kilitlemenin olmayacağının göstergesidir. Eğer bu seçeneği açık bir şekilde belirtmezseniz, SQL Server bu Cursor' ı güncellenebilir olarak tanımlayacaktır. Çünkü bu, Cursor' ların varsayılan seçeneğidir.
Örnek:
DECLARE
cur_Personel_Listesi
CURSOR READ_ONLY FOR SELECT
Personel_No
FROM
DBO.PERSONEL
WHERE
Personel_No > 10
AND
Personel_No <20
Eğer güncellenebilir bir Cursor gerekiyorsa, o zaman OPTIMISTIC seçeneğini tercih etmeye çalışın. SCROLL_LOCK seçeneği tüm kayıtların başarıyla güncelleneceğini taahhüt eder, fakat büyük miktarda kaynak tüketir.
Cursor Tipleri
Bir Cursor' ı FORWARD_ONLY ve\ya da FAST_FORWARD olarak tanımlayabilirsiniz. FORWARD_ONLY tipi, Cursor' ın sadece ileriye doğru devam edeceğini ve başka bir noktaya konumlandırılamayacağını gösterir. Bu, diğer tiplere göre en etkili tiptir. Diğer tipler olan STATIC, KEYSET ve DYNAMIC geçici tabloları ve ek sunucu hafızasına ihtiyaç duyacakları için FORWARD_ONLY kadar etkili değillerdir.
Örnek:
DECLARE
cur_Personel_Listesi
CURSOR FORWARD_ONLY READ_ONLY FOR SELECT
Personel_No
FROM
DBO.PERSONEL
WHERE
Personel_No > 10
AND
Personel_No <20
FAST_FORWARD seçeneği ise FORWARD_ONLY gibidir. Cursor' ın gene sadece tek bir yöne doğru hareket edebileceğini gösterir. Bununla birlikte bu seçenek, Cursor' ın salt-okunur olduğunu da belirtir. FORWARD_ONLY seçeneği ise varsayılan olarak salt-okunur değildir. Bu nedenle FORWARD_ONLY' nin salt-okunur olması için bu komutla birlikte yukarıdaki örnekteki gibi READ_ONLY seçeneği de kullanılır. Ama READ_ONLY seçeneğini FAST_FORWARD ile kullanmaya gerek yoktur.
Ekrem Önsoy
Makaleyi nasıl buldunuz?
Makaleyi nasıl buldunuz?
Çok Kötü
Çok Yararlı
Görüşleriniz : (opsiyonel)
v2.4
Geri Bildirim (Feedback)
Site içerisinde yazılan tüm makalelerin yazım ve yayınlama hakkı aksi belirtilmediği sürece sadece yazarlara aittir.
Yazgelistir.Com Ekibi - 2006 -
Yazgelistir.com