Was sind die Vorteile von Paketen gegenüber eigenständigen Prozeduren und Funktionen?

13

Auf der Suche nach einer kanonischen Antwort auf die Frage, warum Pakete in einer Oracle-Datenbank gegenüber eigenständigen Prozeduren und Funktionen bevorzugt werden sollten.

Leigh Riffel
quelle

Antworten:

12

Vorteile von Paketen

Logische Gruppierung - Methoden, die zusammenarbeiten, können zu einer zusammenhängenden Einheit zusammengefasst werden, anstatt nur logisch gekoppelt, aber physisch getrennt zu sein.

Sichere private Methoden - Funktionen und Prozeduren können für das Paket privat gemacht und nur innerhalb des Pakets verwendet werden. Dies macht die öffentliche Oberfläche einfacher und sicherer.

Rechtemanagement - Berechtigungen können einmal für eine Gruppe von Verfahren gewährt werden , die zusammenarbeiten , anstatt separat für jede Prozedur / Funktion erforderlich.

Sicheres Verpacken - Verpackte Pakete sind schwieriger zu entpacken als verpackte Funktionen / Prozeduren.

Vereinfachte Benennung - Ein größerer Namespace ermöglicht einfachere Namen, die in anderen Paketen wiederverwendet werden können.

Bessere Leistung - Pakete können kompiliert und vollständig in den Speicher geladen werden, anstatt wie bei anderen Methoden stückweise. Dieser Vorteil ist, wenn überhaupt, im Vergleich zu den anderen Vorteilen minimal.

Reduzierte Invalidierung - Das Ändern eines Paketkörpers macht Abhängigkeiten nicht ungültig wie das Ändern einer Funktion oder Prozedur.

Einzigartige Funktionen - Paketvariablen, Paketkonstanten, Initialisierung, Sitzungsstatus, Paketkommentare und überladene Methoden.

Referenzen:
11.2 Concepts Guide
Frage an Tom
StackOverflow.com Frage zur
Paketleistung Auspacken der PL / SQL-Präsentation (pdf)

Leigh Riffel
quelle
2
Ich muss mit dem Leistungsvorteil nicht einverstanden sein. Wenn das Laden von Code in den Speicher ein nennenswertes Warteereignis ist, ist etwas sehr Schlimmes passiert. Und es besteht die große Wahrscheinlichkeit, dass Pakete die Leistung beeinträchtigen, da Sie mehr Code einlesen müssen, wenn Sie das gesamte Paket laden, wenn Sie wirklich nur eine einzige Methode benötigen. In beiden Fällen ist der Leistungsunterschied jedoch nicht messbar.
Justin Cave
@Justin - Dieser Punkt stammt aus dem 11.2 Concepts Guide. Hier steht, was es heißt: "Bessere Leistung - Ein gesamtes Paket wird in kleinen Blöcken in den Speicher geladen, wenn eine Prozedur im Paket zum ersten Mal aufgerufen wird. Dieses Laden wird in einem Vorgang abgeschlossen, im Gegensatz zu den separaten Ladevorgängen, die für Standalone erforderlich sind "Prozeduren. Bei Aufrufen verwandter gepackter Prozeduren ist keine Datenträger-E / A erforderlich, um den kompilierten Code im Arbeitsspeicher auszuführen."
Leigh Riffel
4
Ich bin damit einverstanden, dass die Dokumentation behauptet, dass es einen Leistungsvorteil gibt. Die Dokumentation ist falsch oder zumindest unzureichend. Im besten Fall ist die Höhe des "Vorteils" winzig. Und das Zeichen des Nutzens ist unbekannt. So wie ein Tabellenscan effizienter ist, wenn Sie die meisten Zeilen lesen, und ein Indexzugriff effizienter ist, wenn Sie eine einzelne Zeile lesen, ist es von Vorteil, wenn Sie ein gesamtes Paket auf einmal in den Speicher lesen Verwenden Sie jede Methode und nachteilig, wenn Sie wirklich nur die eine Methode wollten.
Justin Cave
1
@Justin - Ihre Einschätzung klingt logisch. Ich habe auf die eine oder andere Weise nichts Bestimmtes gefunden, daher habe ich den Punkt in der Antwort mit einem Vorbehalt versehen. Danke für deinen Beitrag.
Leigh Riffel
Ich denke, dieser Leistungsvorteil ähnelt dem Caching. Wenn Sie nur dieses Verfahren anwenden und es weniger häufig anwenden, erhalten Sie keinen Leistungsvorteil. Wenn Sie es jedoch häufig verwenden und in diesem Paket ein anderes Verfahren angewendet wird, profitieren Sie davon. Der Entwickler verwendet Caching, da nicht die tatsächliche Leistung, sondern die wahrgenommene Leistung verbessert wird. Da verwandte Prozeduren in dasselbe Paket gestellt werden, ist es logisch, dass auch einige andere Prozeduren aufgerufen werden. Hier geht es um die Wahrscheinlichkeit, zwei Prozeduren in demselben Paket aufzurufen. Und normalerweise, mit hoher Wahrscheinlichkeit gelesen, tritt es auf.
Atilla Ozgur