|
|
|
|
|
 |
SQL Habergrubu |
|
 |
|
En Son SQL Server ile İlgili Okuduğum Kitaplar |
- Accelerated SQL Server 2008 - Apress (İngilizce)
- Designing and Optimizing Data Access by Using SQL Server 2005 - MS Press (İngilizce)
- Microsoft SQL Server 2005 Database Solutions Design - Wiley Publishing (İngilizce)- Optimizing and Maintaining a Database Administration Solution by Using SQL Server 2005 - MS Press (İngilizce)- Designing a Database Server Infrastructure Using SQL Server 2005 - MS Press (İngilizce)- SQL Server 2005 Implementation and Maintenance - MS Press (İngilizce)
- SQL Server 2005 Administrators Companion - MS Press (İngilizce) |
|
|
|
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 <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
|
|
Anasayfa |
|