2011-07-25 12 views
13

W Oracle DBMS, która jest lepszą wydajnością, wywołanie procedury składowanej java z innej przechowywanej procedury pl/sql lub wywołanie procedury składowanej pl/sql z innej przechowywanej procedury pl/sql.Procedura składowana Java Procedura przechowywana w języku PL/SQL

Przy okazji mam pętlę w mojej procedurze pl/sql, która wywoła procedurę java wiele razy (tj. Mój kod jest odwracany między PL/SQL i Java Stored Procedures), więc czy to spowalnia wydajność)?

+4

Chciałbym założyć, że każda rozmowa z PL/SQL do Java wymaga przełączanie kontekstu, więc domyślam się, że działa dość wolno. Być może uda się całkowicie pozbyć pętli, ale nie da się tego powiedzieć bez obejrzenia kodu. –

+0

Dzięki, Frank, właściwie ja, ve wyliczyliśmy czas w milisekundach, wywołania równoważnej procedury pl/sql z taką samą liczbą cykli pętli (cykl pętli 600), a wynik był, prawie nie było różnicy, z wyjątkiem tego, że zakończyła się około 100 milisekund wcześniej. –

+1

Zgadzam się z Frankiem, że będą nieuniknione dwa przełączniki kontekstu dla każdego wywołania procedury składowanej Java (PL/SQL -> Java iz powrotem). Jeśli wywołana procedura jest czysta PL/SQL (tj. Brak dostępu SQL), wówczas opcja PL/SQL byłaby szybsza (spróbuj tego ponad 10000 iteracji zamiast 600). Czy procedura nazwana PL/SQL mogłaby być zdefiniowana jako DETERMINISTYCZNA? Jeśli tak, to może zaoszczędzić ci trochę czasu, jeśli któryś z parametrów zostanie powtórzony w Twojej pętli. Jakiej wersji Oracle używasz? Jeśli jest to 11g, funkcja wstawiania powinna sprawić, że wywołanie PL/SQL do PL/SQL będzie naprawdę szybkie. – Ollie

Odpowiedz

12

Każde przejście z jednego języka na drugi będzie wiązało się z obciążeniem (może być małe, ale nadal będzie dostępne). Jeśli jest w pętli, zostanie zaakcentowany.

Zachowaj prostotę i jeśli możesz trzymać się PL/SQL, to zrób tak.

Tom Kyte (Oracle Corporation wiceprezes i Guru) ma mantrę, która wydaje się pasować do powtórzenia tutaj:

(Reference: http://tkyte.blogspot.com/2006/10/slow-by-slow.html)

  • Należy to zrobić w jednym SQL jeśli w wszystko możliwe.
  • Jeśli nie możesz tego zrobić w pojedynczej instrukcji SQL, zrób to w PL/SQL.
  • Jeśli nie możesz tego zrobić w PL/SQL, spróbuj procedury składowanej Java.
  • Jeśli nie możesz tego zrobić w Javie, zrób to w zewnętrznej procedurze C.
  • Jeśli nie można tego zrobić w rutynę zewnętrznego C, warto poważnie zastanowić się, dlaczego to trzeba to zrobić ...
Powiązane problemy