Quais são os benefícios dos pacotes sobre procedimentos e funções independentes?

13

Procurando uma resposta canônica para a pergunta sobre por que os pacotes devem ser preferidos em um banco de dados Oracle em vez de procedimentos e funções independentes.

Leigh Riffel
fonte

Respostas:

12

Benefícios dos Pacotes

Agrupamento lógico - Os métodos que trabalham juntos podem ser colocados em uma unidade coesa, em vez de apenas acoplados logicamente, mas fisicamente separados.

Métodos privados seguros - Funções e procedimentos podem ser tornados privados para o pacote e somente ser usados ​​nele. Isso torna a superfície pública mais simples e mais segura.

Gerenciamento de privilégios - As permissões podem ser concedidas uma vez para um grupo de procedimentos que trabalham juntos, em vez de separadamente, para cada procedimento / função necessária.

Invólucro seguro - Pacotes embrulhados são mais difíceis de desembrulhar do que funções / procedimentos embrulhados.

Nomenclatura simplificada - Um espaço para nome maior permite nomes mais simples e que podem ser reutilizados em outros pacotes.

Melhor desempenho - Os pacotes podem ser compilados e carregados na memória por inteiro, em vez de fragmentados como outros métodos. Esse benefício, se existir, é mínimo comparado aos outros benefícios.

Invalidação reduzida - A alteração do corpo de um pacote não invalida dependências, como a alteração de uma função ou procedimento.

Recursos exclusivos - Variáveis ​​do pacote, constantes do pacote, inicialização, estado da sessão, comentários do pacote e métodos sobrecarregados.

Referências:
11.2 Guia de conceitos Faça uma
pergunta a Tom
StackOverflow.com Pergunta sobre o desempenho do pacote
Desempacotando a apresentação PL / SQL (pdf)

Leigh Riffel
fonte
2
Eu tenho que discordar do benefício de desempenho. Se o carregamento de código na memória é um evento de espera apreciável, algo muito ruim aconteceu. E existe uma forte possibilidade de o fato de os pacotes diminuirem o desempenho, porque você precisa ler mais código ao carregar o pacote inteiro, quando realmente só precisava de um único método. Em nenhum dos casos, porém, a diferença de desempenho será mensurável.
Justin Caverna
@ Justin - Esse ponto é do Guia de conceitos 11.2. Aqui está o que diz: "Melhor desempenho - Um pacote inteiro é carregado na memória em pequenos blocos quando um procedimento no pacote é chamado pela primeira vez. Esse carregamento é concluído em uma operação, em oposição às cargas separadas necessárias para o standalone. Quando ocorrem chamadas para procedimentos empacotados relacionados, nenhuma E / S de disco é necessária para executar o código compilado na memória. "
Leigh Riffel
4
Concordo que a documentação alega que há um benefício de desempenho. A documentação está incorreta ou, no mínimo, insuficiente. Na melhor das hipóteses, a magnitude do "benefício" é minúscula. E o sinal do benefício é desconhecido. Assim como uma varredura de tabela é mais eficiente se você estiver lendo a maioria das linhas e um acesso ao índice for mais eficiente se você estiver lendo uma única linha, a leitura de um pacote inteiro na memória de uma só vez é benéfica se você quiser use todos os métodos e desvantajosos se você realmente quiser apenas o único método.
Justin Caverna
1
@ Justin - Sua avaliação parece lógica. Não encontrei nada definitivo de uma maneira ou de outra, então adicionei uma ressalva ao ponto da resposta. Obrigado pela sua contribuição.
precisa
Eu acho que esse benefício de desempenho é semelhante ao cache. Se você usar apenas esse procedimento e usá-lo com menos frequência, não obterá nenhum benefício de desempenho. Mas se você o usar com freqüência e qualquer outro procedimento for usado neste pacote, você obterá benefícios. O desenvolvedor ao redor está usando o cache, pois o desempenho não é real, mas o desempenho percebido é aprimorado. Como os procedimentos relacionados são colocados no mesmo pacote, é lógico que outros procedimentos também sejam chamados. Isso significa probabilidade de chamar dois procedimentos no mesmo pacote. E normalmente, leia com alta probabilidade, isso ocorre.
Atilla Ozgur