¿Cuáles son los beneficios de los paquetes sobre los procedimientos y funciones independientes?

13

Buscando una respuesta canónica a la pregunta de por qué los paquetes deberían preferirse en una base de datos Oracle en lugar de procedimientos y funciones independientes.

Leigh Riffel
fuente

Respuestas:

12

Beneficios de los paquetes

Agrupamiento lógico : los métodos que funcionan juntos se pueden colocar en una unidad cohesiva en lugar de simplemente acoplarse lógicamente, pero físicamente separados.

Métodos privados seguros : las funciones y los procedimientos se pueden hacer privados del paquete y solo se pueden usar dentro de él. Esto hace que la superficie pública sea más simple y segura.

Gestión de privilegios : los permisos se pueden otorgar una vez para un grupo de procedimientos que funcionan juntos en lugar de por separado para cada procedimiento / función requerida.

Envoltura segura : los paquetes envueltos son más difíciles de desenvolver que las funciones / procedimientos envueltos.

Nombres simplificados : un espacio de nombres más grande permite nombres que son más simples y pueden reutilizarse en otros paquetes.

Mejor rendimiento : los paquetes pueden compilarse y cargarse en la memoria en su totalidad en lugar de fragmentarse como otros métodos. Este beneficio, si es que existe, es mínimo en comparación con los otros beneficios.

Invalidación reducida : cambiar el cuerpo de un paquete no invalida las dependencias como lo hace el cambio de una función o procedimiento.

Características únicas : variables de paquete, constantes de paquete, inicialización, estado de sesión, comentarios de paquete y métodos sobrecargados.

Referencias:
11.2 Guía de conceptos
Pregunta a Tom Pregunta
StackOverflow.com Pregunta sobre el rendimiento del paquete
Desenvolviendo presentación PL / SQL (pdf)

Leigh Riffel
fuente
2
Tengo que estar en desacuerdo con el beneficio de rendimiento. Si cargar código en la memoria es un evento de espera apreciable, ha sucedido algo muy malo. Y existe una gran posibilidad de que el hecho de que los paquetes disminuyan el rendimiento porque debe leer más código cuando carga el paquete completo cuando realmente solo necesita un método único. Sin embargo, en ninguno de los casos, la diferencia de rendimiento será medible.
Justin Cave
@Justin - Ese punto es de la Guía de conceptos 11.2. Esto es lo que dice: "Mejor rendimiento: un paquete completo se carga en la memoria en pequeños fragmentos cuando se llama a un procedimiento en el paquete por primera vez. Esta carga se completa en una operación, a diferencia de las cargas separadas requeridas para el uso independiente procedimientos. Cuando se producen llamadas a procedimientos empaquetados relacionados, no se necesita E / S de disco para ejecutar el código compilado en la memoria ".
Leigh Riffel
44
Estoy de acuerdo en que la documentación afirma que hay un beneficio de rendimiento. La documentación es incorrecta o, como mínimo, insuficiente. En el mejor de los casos, la magnitud del "beneficio" es minúscula. Y el signo del beneficio es desconocido. Del mismo modo que un escaneo de tabla es más eficiente si está leyendo la mayoría de las filas y un acceso al índice es más eficiente si está leyendo una sola fila, leer un paquete completo en la memoria de una vez es beneficioso si va a use todos los métodos y desventajoso si realmente solo desea el método.
Justin Cave
1
@Justin - Tu evaluación suena lógica. No he encontrado nada definitivo de una forma u otra, así que agregué una advertencia al punto en la respuesta. Gracias por tu contribución.
Leigh Riffel
Creo que este beneficio de rendimiento es similar al almacenamiento en caché. Si usa solo ese procedimiento y lo usa con menos frecuencia, no obtendrá ningún beneficio de rendimiento. Pero si lo usa con frecuencia y se utiliza cualquier otro procedimiento en este paquete, obtendrá beneficios. El desarrollador en general utiliza el almacenamiento en caché, ya que no se mejora el rendimiento real sino el rendimiento percibido. Dado que los procedimientos relacionados se ponen en el mismo paquete, es lógico que también se invoquen otros procedimientos. Esto se trata de la probabilidad de llamar a dos procedimientos en el mismo paquete. Y normalmente, leer con alta probabilidad, ocurre.
Atilla Ozgur