"FOR LOOP" vs "FETCH,OPEN,CLOSE"


#1

PLSQL програм нь PLSQL runtime engine – тай, SQL нь SQL runtime engine – тай ба Хэрвээ PLSQL дотор SQL бичигдсэн байвал PLSQL REngine -> SQL REngine – луу “context switch” хийгддэг. Эсрэгээрээ мөн SQL REngine – с PLSQL REngine – лүү бас хийнэ.

Context switch гэдэг нь PLSQL REngine – аас SQL REngine – рүү удирдлагыг бүрэн шилжүүлж боловсруулалт хийхийг хэлдэг . Нэг ёсондоо context switch – нь тодорхой хугацаа, resource шаарддаг, өртөгтэй үйлдэл.

PLSQL бичхэд LOOP бичих шаардлага гарах нь их байдаг ба "FOR LOOP" болон "FETCH, OPEN,CLOSE" гэсэн байдлаар давтах боломжтой Эдгээрийн гол ялгаа нь:

“FOR LOOP” – г ашигласнааар PLSQL implicit байдлаар cursor – г удирдана. 11g дээр default-р 100 мөр fetch хийгдэх бүрт нэг удаа cursor нээгдэж хаагдана, 1 л удаа context switch хийнэ. 1сая мөр уншихад нийт далд байдлаар 10k cursor нээж хаагдаж, 10k л context switch хийгдэнэ гэсэн үг. (+ sql logic - с хамаарна. )

Харин “FETCH, OPEN, CLOSE” – г ашиглавал PLSQL explicit байдлаар cursor – оо зохицуулхыг шаардах буюу, бид бүх management – г өөрсдөө хийнэ, Хэзээ нь CURSOR нээх, хэзээ хаах, дунд нь ямар төрлийн алдаа гарвал ямар exception өгөх зэрэг бүхий л management – ийн асуудлыг manual байдлаар удирдах юм. Гэхдээ FETCH бүр дээр буюу 1 мөр бүрт 1 context switch хийгдэнэ. 1сая мөр fetch хийгдэхэд, 1сая context switch хийгдэнэ. (BULK COLLECT ашиглаагүй үед)

Иймээс ихэнх case дээр “FOR LOOP” - г ашигласанаар найдвартай, хурдан байдаг байна. :slight_smile:

#forDevelopers


#2

Үүнтэй холбоотой тохиолдлууд дээр жишээ авч санал солилцьё?
1.Эхний тохиолдол

open 
fetch table1 BULK COLLECT into aa;
for i in aa .first .. aa .last loop
      ------insert, update, delete bla bla
end loop;
close;

2.Дараагийн тохиолдол

open 
fetch table1 BULK COLLECT into aa;
forall i in aa .first .. aa .last
     ------insert, update, delete bla bla
commit;
close;

3.Бас нэг хэлбэр

 loop
 fetch table1 BULK COLLECT into aa LIMIT 1000;
 EXIT WHEN aa .count = 0;  
 forall i in aa .first .. aa .last
     ------insert, update, delete bla bla
 commit;
 end loop;

Би эндээс 3-р хувилбарыг их ашиглаж байгаа.Эхний 2 -оосоо системийн мемори хэрэглэх нь харьцангуй бага 1 сая-аас дээш дата дээр хурдтай ажиллаж байгаа харагдсан.Зөв сэдэв дээрээ бичив үү яах, буруу зөрүү юм байвал хэлээрэй.


#3

Бичсэн 3 case дээр нь авж үзвэл:

  1. 1 мөр бүр дээр context switch хийгдэнэ. Memory ашиглалт бага, context switch ихтэй учир удаан ажиллана.
  2. 100 мөр тутамд context switch хийнэ. Memory ашиглалт дунд, Дээрхээс context switch 100 дахин бага.
  3. 1000 мөр тутамд context switch хийнэ. Memory ашиглалт их. Context switch 2-дохиос 10 дахин бага хийгдэнэ. Гэхдээ бааз серверийн memory бага бол, average row size нь их байвал нийт performance - г down болгох магадлалтай.