Cursor Kullanımı
Öncelikle mümkün olduğu kadar, “Cursor” kullanılmamalıdır. Cursor müthiş performans kaybı yapar.
Cpu’yu çok tüketir.
http://www.sql-server-performance.com/2007/cursors/
“Cursor” lar, select ifadelerinde tanımlanıyor.
Cursor işlemlerini hızlandırmanın iki yolu vardır :
A) Cursor üzerinden update yapılmayacaksa ve cursor ile satırlar arasında sadece ileriye doğru ilerlenecekse: “FAST_FORWARD” seçeneği kullanılmalıdır. Fastforward seçeneği read_only cursor oluşturur. Normal cursor’den daha hızlıdır.
Örnek:
DECLARE cursor_name CURSOR FAST_FORWARD FOR
[Select ifadesi]
Not: Cursor üzerinden güncelleme olmasa da , normal sorgu üzerinden güncelleme yapılabilir.
B) Cursor üzerinden update yapılacaksa: “where current of cursor_ismi” seçeneği kullanılmalıdır. Bu seçenek kullanıldığında , “update” ifadesindeki where şartı ile ilgili kayıt aranmaz (performans ve cpu avantajı getirir) , cursor bulunduğu satırı günceller.
Örnek:
Tanımlanan cursor:
declare cur_xmllist cursor for
select hbysdataID,packet_text,Attribute,(Day+Time) CDTS, establish_code
from tbl_hbys_data where packet_check_list_type='SendDepartmentGeneralInfo'
and (Day+Time)>=20111010114100
and datastoragehandling=0
Cursor üzerinden update işlemi:
update tbl_hbys_data set datastoragehandling=1 where CURRENT of cur_xmllist
Not: Aşağıdaki update sorgusu cursor üzerinden update yapmaz. Tabloda search yapıp, kaydı bulup update eder. Tabloda search yaptığı için performans kaybına neden olur.
update tbl_hbys_data set datastoragehandling=1 where hbysdataID=@packetID
Not: Cursor tanımlanan select ifadesi , cursor üzerinden güncelleme yapmaya izin vermeyebilir. Cursor otomatik olarak kendiliğinden read_only olur. Bu konu microsoft dökümanlarında da belirtilmiştir. O yüzden test edilmelidir.
Örnek:
Cursor üzerinden güncellemeye izin vermeyen bir select ifadesi:
select row_number() over (order by PrimaryCallId ,convert(datetime,substring(StartDateTime,1,4)
+'-'+substring(StartDateTime,5,2)+'-'+substring(StartDateTime,7,2)+' '+
substring(StartDateTime,9,2)+':'+substring(StartDateTime,11,2)+':'+substring(StartDateTime,13,2)))
as rownum,Id,PrimaryCallId,Calling,StartDateTime,Called,Extension,(convert(int,Duration)) Duration,
(convert(int,HoldDuration)) HoldDuration ,
(convert(int,WaitDuration)) WaitDuration,RecordLocation,
CallType,(convert(int,RingDuration)) RingDuration,Date from call.cdr
Where ............
Comments (0)