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

 

Bu Makaleyi Paylaş

Yorumlar (0)

Yorum Bırak