ďťż
 
[ORACLE] Petla kursorowa - wydajnosc ďťż
 
[ORACLE] Petla kursorowa - wydajnosc
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • natalia97.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com