[ORACLE] Petla kursorowa - wydajnosc
Szczepan Marchewka - 30-06-2006 00:07
[ORACLE] Petla kursorowa - wydajnosc
Czesc
Mam w aplikacji WebPLSQL petle kursorowa, w ktorej generuje tabelke HTML, przetwarzajac wiersz po wierszu kursor. Dokladnie kodu nie wkleje, ale mniej wiecej wyglada to tak:
open v_kursor for select ....; loop fetch v_kursor into v_pole1....; exit when v_kursor%notfound; if v_pole1 .... then .. else .. end if; end loop; close v_kursor;
Zeby poprawic wydajnosc aplikacji rozwazam przerobienie tego fragmentu kodu na dwa sposoby:
A) open v_kursor for select ....; fetch v_kursor bulk collect into v_tablica1...; close v_kursor; for i in v_kursor.first .. v_kursor.last loop if v_tablica1(i) .... then .. else .. end if; end loop;
B) open v_kursor for select ....; loop fetch v_kursor bulk collect into v_tablica1....; if v_tablica1.last is not null and v_tablica1.last>0 then for i in v_tablica1.first .. v_tablica1.last loop if v_tablica1(i).. then .. else .. end if; end; end if; exit when v_kursor%notfound; end loop; close v_kursor;
Przypadek A) laduje do tablic caly kursor i z tego powodu chyba niezbyt nadaje sie do przetwarzania baaaardzo duzych kursorow. Przypadek drugi bylby chyba dla mnie bardziej adekwatny.
Jaka moze byc oczekiwana roznica w wydajnosci rozwiazan A) i B) wzgledem siebie i rozwiazania istniejacego obecnie (czyli zwyklej petli kursorowej w starym stylu)?
Jesli warto skorzystac z FETCH BULK COLLECT w tym przypadku, to ktore rozwiazanie warto zastosowac w przypadku baaardzo duzych kursorow?
Pozdrawiam i czekam na jakies wskazowki.
Szczepan@Marchewka.info.pl ----- In the beginner's mind there are many possibilities, but in the expert's mind there are few. (Shunryu Suzuki 1905-1971)
=?ISO-8859-2?Q?Micha=B3?= Kuratczyk - 30-06-2006 00:07
Szczepan Marchewka wrote: > A) > open v_kursor for select ....; > fetch v_kursor bulk collect into v_tablica1...; > close v_kursor; > for i in v_kursor.first .. v_kursor.last loop > if v_tablica1(i) .... then > .. > else > .. > end if; > end loop; > > B) > open v_kursor for select ....; > loop > fetch v_kursor bulk collect into v_tablica1....; > if v_tablica1.last is not null and v_tablica1.last>0 then > for i in v_tablica1.first .. v_tablica1.last loop > if v_tablica1(i).. then > .. > else > .. > end if; > end; > end if; > exit when v_kursor%notfound; > end loop; > close v_kursor; > > Przypadek A) laduje do tablic caly kursor i z tego powodu chyba niezbyt > nadaje sie do przetwarzania baaaardzo duzych kursorow. Przypadek drugi > bylby chyba dla mnie bardziej adekwatny. Również obstawałbym przy B. Pamiętaj tylko o odpowiednim ustawieniu LIMIT. Na początek może to być 100, ale warto sprawdzić jak się zachowa dla większych i mniejszych wartości.
> Jaka moze byc oczekiwana roznica w wydajnosci rozwiazan A) i B) wzgledem > siebie i rozwiazania istniejacego obecnie (czyli zwyklej petli kursorowej > w starym stylu)? Sprawdź. :-) Różnica może się okazać bardzo istotna.
-- Michał Kuratczyk
=?ISO-8859-2?Q?S=B3awomir_Szysz=B3o?= - 30-06-2006 00:08
Dnia Thu, 29 Jun 2006 11:12:20 +0200, "Szczepan Marchewka" <szczepan@marchewka.info.plUSUNTO> wklepał(-a):
>Przypadek A) laduje do tablic caly kursor i z tego powodu chyba niezbyt >nadaje sie do przetwarzania baaaardzo duzych kursorow. Przypadek drugi >bylby chyba dla mnie bardziej adekwatny. > >Jaka moze byc oczekiwana roznica w wydajnosci rozwiazan A) i B) wzgledem >siebie i rozwiazania istniejacego obecnie (czyli zwyklej petli kursorowej w >starym stylu)? > >Jesli warto skorzystac z FETCH BULK COLLECT w tym przypadku, to ktore >rozwiazanie warto zastosowac w przypadku baaardzo duzych kursorow?
Jeśli mają być baaardzo duże, to zdecydowanie B) + fetch z limitem. Stwórz sobie jakąś dużą tablicę i poobserwuj ile pamięci zajmuje proces podczas przetwarzania. Klasyczne rozwiązanie stosuj tylko dla niewielkiej liczby rekordów. -- Sławomir Szyszło mailto:slaszysz@poczta.onet.pl Primus inter FAQires & Grand Inquisitor no.0 of pl.comp.bazy-danych FAQ pl.comp.bazy-danych http://www.dbf.pl/faq/ Archiwum http://groups.google.com/groups?grou...mp.bazy-danych
dap - 30-06-2006 00:08
Szczepan Marchewka wrote: > Czesc > > Mam w aplikacji WebPLSQL petle kursorowa, w ktorej generuje tabelke HTML, > przetwarzajac wiersz po wierszu kursor. Dokladnie kodu nie wkleje, ale > mniej wiecej wyglada to tak:
Hej, Przy optymalizacji musisz wiedziec co robi baza danych, a nie to co ty myslisz ze robi albo moze zrobic. Masz jakies narzedzia by zmierzyc czas działania i ilosc uzytych blokow programu w poszczegolnych wersjach?
Jesli nie to zrob trace dla danej sesji i przez tkprof zobacz wyniki dla 3 poszczegolnych kodow. Oracle posiada tez narzedzie do profilownia - profiler moze ono bedzie Ci pomocne.
> Przypadek A) laduje do tablic caly kursor i z tego powodu chyba niezbyt > nadaje sie do przetwarzania baaaardzo duzych kursorow. Przypadek drugi > bylby chyba dla mnie bardziej adekwatny.
Z tego co ja wiem kursor struktura dynamiczna i chyba nie mozna 'ladowac do tablic calego kursora' - no chyba, ze Cie zle zrozumialem.
> Jaka moze byc oczekiwana roznica w wydajnosci rozwiazan A) i B) wzgledem > siebie i rozwiazania istniejacego obecnie (czyli zwyklej petli kursorowej w > starym stylu)? To trzeba zmierzyc na serwerze:)
dap
-- ,= ,-_-. =. gnu.org ((_/)o o(\_)) polanski.biz `-'(. .)`-' xoops.pl \_/
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
Oracle 19g +Insert +Insert +Insert...
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[Oracle] jak =?ISO-8859-2?Q?ograniczy=E6_pami=EA=E6_dla_se?==?ISO-8859-2?Q?rwera=3F?=
=?ISO-8859-2?Q?=5BOT=5D_Zdany_egzamin_Oracle_1Z0-007_a?==?ISO-8859-2?Q?_brak_informacji_na_stronie_Prometric_-_czy?==?ISO-8859-2?Q?_co=B6_nie_tak=3F?=
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
[oracle 10g] czy =?ISO-8859-2?Q?mo=BFna_wy=B3=B1czy=E6_wszys?==?ISO-8859-2?Q?tkie_wi=EAzy_w_schemacie=3F?=
MSSQL Express czy Oracle Express
=?iso-8859-2?q?[oracle]_Jak_sprawdzi=E6_wielko=B6=E6_tabeli_=3F=3F?=
[Oracle] =?ISO-8859-2?Q?=A3=B1czenie_wierszy_z_zapytania_?==?ISO-8859-2?Q?w_jeden_string?=
zanotowane.pldoc.pisz.plpdf.pisz.plnatalia97.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|