Jakie są zalety pakietów w porównaniu z samodzielnymi procedurami i funkcjami?


13

Poszukuję kanonicznej odpowiedzi na pytanie, dlaczego pakiety powinny być preferowane w bazie danych Oracle zamiast samodzielnych procedur i funkcji.

Odpowiedzi:


12

Korzyści z pakietów

Logiczne grupowanie - metody, które działają razem, mogą być umieszczone w spójnej jednostce, a nie tylko logicznie połączone, ale fizycznie oddzielne.

Bezpieczne prywatne metody - funkcje i procedury mogą być prywatne dla pakietu i mogą być używane tylko w nim. Dzięki temu powierzchnia publiczna jest prostsza i bezpieczniejsza.

Zarządzanie uprawnieniami - uprawnienia można przyznać raz dla grupy procedur, które współpracują, a nie osobno dla każdej wymaganej procedury / funkcji.

Bezpieczne pakowanie - Opakowane pakiety są trudniejsze do rozpakowania niż opakowane funkcje / procedury.

Uproszczone nazewnictwo - większa przestrzeń nazw pozwala na nazwy, które są prostsze i mogą być ponownie użyte w innych pakietach.

Lepsza wydajność - Pakiety mogą być kompilowane i ładowane do pamięci w całości, a nie fragmentarycznie jak inne metody. Ta korzyść, jeśli w ogóle istnieje, jest minimalna w porównaniu z innymi korzyściami.

Zmniejszone unieważnienie - zmiana treści pakietu nie unieważnia zależności, podobnie jak zmiana funkcji lub procedury.

Unikalne funkcje - zmienne pakietu, stałe pakietu, inicjalizacja, stan sesji, komentarze do pakietu i przeciążone metody.

Odniesienia:
11.2 Przewodnik pojęciach
Zadaj Tomowi pytanie
StackOverflow.com Pytanie o rozpakowywanie wydajności pakietu
Prezentacja PL / SQL (pdf)


2
Muszę się nie zgodzić z korzyścią dla wydajności. Jeśli ładowanie kodu do pamięci jest znaczącym zdarzeniem oczekiwania, dzieje się coś bardzo złego. Istnieje duża możliwość, że fakt, iż pakiety zmniejszą wydajność, ponieważ musisz wczytać więcej kodu, gdy ładujesz cały pakiet, gdy naprawdę potrzebujesz tylko jednej metody. Jednak w żadnym przypadku różnica wydajności nie będzie mierzalna.
Justin Cave

@Justin - Ten punkt pochodzi z Przewodnika pojęciowego 11.2. Oto, co mówi: „Lepsza wydajność - Cały pakiet jest ładowany do pamięci w małych porcjach, gdy procedura w pakiecie jest wywoływana po raz pierwszy. To ładowanie jest zakończone w jednej operacji, w przeciwieństwie do osobnych ładowań wymaganych dla samodzielnego procedury. W przypadku wywoływania powiązanych powiązanych procedur pakietowych nie jest potrzebne dyskowe operacje we / wy do uruchomienia skompilowanego kodu w pamięci. ”
Leigh Riffel,

4
Zgadzam się, że dokumentacja twierdzi, że istnieje korzyść z wydajności. Dokumentacja jest nieprawidłowa lub przynajmniej niewystarczająca. Najlepszy przypadek to, że wielkość „korzyści” jest znikoma. A znak korzyści nie jest znany. Podobnie jak skanowanie tabeli jest bardziej wydajne, jeśli czytasz większość wierszy, a dostęp do indeksu jest bardziej wydajny, jeśli czytasz pojedynczy wiersz, odczytywanie całego pakietu do pamięci za jednym razem jest korzystne, jeśli masz zamiar używaj każdej metody i niekorzystnej, jeśli naprawdę chcesz tylko jednej metody.
Justin Cave,

1
@Justin - Twoja ocena brzmi logicznie. Nie znalazłem nic definitywnego w ten czy inny sposób, więc dodałem zastrzeżenie do sedna odpowiedzi. Dzięki za wkład.
Leigh Riffel,

Myślę, że ta korzyść z wydajności jest podobna do buforowania. Jeśli użyjesz tylko tej procedury i rzadziej z niej korzystasz, nie zyskasz żadnej wydajności. Ale jeśli będziesz go często używać i jakakolwiek inna procedura zostanie zastosowana w tym pakiecie, zyskasz korzyści. Deweloper dookoła używa buforowania, ponieważ nie jest to rzeczywista wydajność, ale poprawiona jest postrzegana wydajność. Ponieważ powiązane procedury są umieszczane w tym samym pakiecie, logiczne jest, że wywoływane będą również inne procedury. Chodzi o prawdopodobieństwo wywołania dwóch procedur w tym samym pakiecie. I zwykle, czytane z dużym prawdopodobieństwem, występuje.
Atilla Ozgur
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.