3 Temmuz 2008 Perşembe

Cursor' lar hakkında dikkat edilmesi gereken birkaç husus

Cursor' lar hakkında dikkat edilmesi gereken birkaç husus

Son güncelleme tarihi: 20 Haziran 2008


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 " ve hemen altında da "DEALLOCATE " 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

Hiç yorum yok: