|
|
|
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 |
|