konto usunięte

Temat: Czy forall w Oracle przyspiesza?

Robię testy.
Po skończonych obliczeniach i zapełnieniu tablicy ładuję dane do tabeli.

SPOSÓB PIERWSZY:
Z_liczebnosc:=z_tablica.COUNT;
FOR I IN 1..Z_LICZEBNOSC loop
insert INTO liczby1(liczba,CZAS)VALUES( z_tablica(I).liczba,z_tablica(I).czas);
end loop;
commit;

SPOSÓB DRUGI:

Z_liczebnosc:=z_tablica.COUNT;
FORALL i IN 1..Z_LICZEBNOSC
insert INTO liczby2(liczba,CZAS) VALUES( z_tablica(i).liczba,z_tablica(i).czas);
commit;


Na szkoleniu Oracla, w podręcznikach, wszędzie mówią że forall jest lepsze bo ładuje wszystko na raz więc nie przełącza między maszynami PL/SQL a SQL.

Mi jednak jakich testów bym nie robił to zawsze szybciej wyjdzie tradycyjne wstawiania, pętlą FOR i IN poczatek..koniec loop.
Na półtorej minuty całej procedury różnica wynosi około 1/10 sekundy ale zawsze na korzyść tradycji :)
Czy ktoś ma inne doświadczenia lub uwagi?

konto usunięte

Temat: Czy forall w Oracle przyspiesza?

Krzysztof Hrycko:
Na półtorej minuty całej procedury różnica wynosi około 1/10 sekundy ale zawsze na korzyść tradycji :)

Wybaczymy ze względu na znikoma szkodliwość społeczną testu :)

A liczby1 i liczby2 to różne tabele ? Jeśli tak to stawiam na różnicę w I/O a nie PL/SQL.

konto usunięte

Temat: Czy forall w Oracle przyspiesza?

Krzysztof Pułapa:

A liczby1 i liczby2 to różne tabele ? Jeśli tak to stawiam na
różnicę w I/O a nie PL/SQL.


Różne tabele mające taką samą strukturę, chodzi o to by przetestować jedynie sekcję ładowania danych by mieć pewność ze jedyną zmienną jest sposób ładowania.
Być może masz rację że to sprawy I/O, ale to jedynie znaczy że nawet gdy ładuje się po 216000 rekordów różnica w czasie pracy jest znikoma.

konto usunięte

Temat: Czy forall w Oracle przyspiesza?

Krzysztof Hrycko:
Być może masz rację że to sprawy I/O, ale to jedynie znaczy że nawet gdy ładuje się po 216000 rekordów różnica w czasie pracy jest znikoma.

Tyle, że przy takich niedużych próbkach trudno o jednoznaczne wyniki. Na serwerze dzieją się też inne rzeczy ... np. jedna transakcja spowodowała dwa przełączenia redologów, a druga tylko jedno, itp itd i już masz "pik w I/O".

Żeby mieć większą pewność co do wyniku to trzeba byłoby to puścić na dłużej i zrobić wcześniej: switch logfile, flush shared_pool i db_cache.

konto usunięte

Temat: Czy forall w Oracle przyspiesza?

wstyd mi :(
Po prostu nie te czasy liczyłem. Liczyłem początek obliczeń i zakończenie, a powinienem mierzyć po za kończeniu liczenia a przed ładowaniem.
teraz zrobiłem
insert into testowanie(sposob,miejsce,czas) values ('forall','poczatek',SYSTIMESTAMP);
FORALL i IN 1..Z_LICZEBNOSC
insert INTO liczby_pierwsze(liczba) VALUES( z_tablica(i).liczba);
insert into testowanie(sposob,miejsce,czas) values ('forall','koniec',SYSTIMESTAMP);

i

insert into testowanie(sposob,miejsce,czas) values ('normalny','poczatek',SYSTIMESTAMP);
FOR I IN 1..Z_LICZEBNOSC loop
insert INTO liczby_pierwszee(liczba)VALUES( z_tablica(I).liczba);
end loop;
insert into testowanie(sposob,miejsce,czas) values ('normalny','koniec',SYSTIMESTAMP);

Teraz się okazuje że wstawiania w normalnej pętli trwa 11.419 sekundy, a forall trwa 0.172 sekundy!!
Daje to wynik 66 razy krótszy.

konto usunięte

Temat: Czy forall w Oracle przyspiesza?

Krzysztof Hrycko:
Daje to wynik 66 razy krótszy.

Historia ci to wybaczy ;)



Wyślij zaproszenie do