Hoþgeldiniz           
   
"SQL Server baþvuru kaynaðýnýz"
Skip Navigation Links
=========
Anasayfa
Makaleler
Hatalar \ Çözümler
Duyurular
Diðer
Ýpuçlarý
Yararlý Adresler
Mesaj TahtasýExpand Mesaj Tahtasý
HakkýmdaExpand Hakkýmda
Ýletiþim
Kullanýcý Adý:
Þifre:
 

Ne Mutlu Türküm Diyene!

SQL Server ile ilgili soru sormak için buraya týklayýn!


Yazýlarýmý nasýl buluyorunuz?






En Son SQL Server ile Ýlgili Okuduðum Kitaplar
- Inside Microsoft SQL Server 2005: Query Tuning and Optimization - MS Press (Ýngilizce)
- 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


 
Bu sitenin tüm haklarý, Ekrem Önsoy' a aittir.