AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 18339
Accepted
Chris Aldrich
Chris Aldrich
Asked: 2012-05-24 12:43:19 +0800 CST2012-05-24 12:43:19 +0800 CST 2012-05-24 12:43:19 +0800 CST

Práticas recomendadas de procedimentos armazenados: com ou sem proteção?

  • 772

Acredito que entendo as razões por trás dos procedimentos armazenados protegidos e não protegidos.

Execução limitada "fora" do banco de dados (no nosso caso, DB2) para evitar possível corrupção do mecanismo do banco de dados, caso haja problemas com coisas como ponteiros.

Unfenced é executado "dentro" do banco de dados, o que significa que o desempenho é melhor.

Pelo que também pesquisei, o SQL PL sempre é basicamente não protegido, porque é SQL e, portanto, não pode acessar a memória como as linguagens de programação.

Os procedimentos C/C++ e Java podem ser executados com ou sem proteção. Mas, como eles podem acessar a memória, deve-se considerar executá-los protegidos, a menos que haja certeza da qualidade do código para não travar e que precise de desempenho.

Em primeiro lugar, estou correto em meu entendimento do que foi dito acima?

Em seguida, geralmente é uma prática recomendada começar com todos os procedimentos armazenados (mesmo aqueles definidos como SQL PL) como limitados primeiro?

Quaisquer outras práticas recomendadas para procedimentos armazenados, especialmente relacionados a cercas e/ou segurança?

EDIT: Pesquisas adicionais mostraram que os procedimentos SQL PL não podem ser executados com vedação. Como eles não contêm nenhum código que possa danificar o mecanismo do banco de dados, como ponteiros ou E/S de arquivo, o DB2 sabe que eles são seguros e os executa dentro do mecanismo (ou seja, sem proteção). Dito isto, ainda estou procurando as melhores práticas em relação a todos os outros procedimentos armazenados.

stored-procedures best-practices
  • 2 2 respostas
  • 3673 Views

2 respostas

  • Voted
  1. Best Answer
    mustaccio
    2013-07-11T08:30:28+08:002013-07-11T08:30:28+08:00

    Para ser mais preciso, as NOT FENCEDrotinas são executadas no mesmo espaço de processo que o próprio gerenciador de banco de dados. O mecanismo é escrito em C, portanto, chamar uma rotina não limitada é como chamar outra função C de main(). É daí que vêm todos os aspectos de corrupção de memória e desempenho: uma rotina não limitada tem acesso a todos os mesmos recursos -- memória, arquivos, etc. -- como o próprio processo do gerenciador de banco de dados.

    Para uma FENCEDrotina, o gerenciador de banco de dados inicia um processo separado ( db2fmp), que por sua vez executa o código da rotina. Como resultado, a proteção do sistema operacional impede que uma rotina limitada acesse qualquer área de memória ou recurso que pertença ao gerenciador de banco de dados.

    As rotinas SQL não podem ser protegidas , estritamente falando, porque elas não "executam", mas são ainda melhores do que não protegidas -- elas são bytecode que o próprio mecanismo de tempo de execução do DB2 executa, portanto, não há encadeamento ou processo separado.

    As rotinas C e C++ podem ser protegidas, caso em que são executadas em processos separados, ou não protegidas, caso em que são carregadas no espaço do processo do gerenciador de banco de dados e chamadas como funções.

    As rotinas Java só podem ser protegidas pelo fato de precisarem de um processo separado, a máquina virtual Java, para serem executadas. Se você declará-los como NÃO FENCED, a opção será silenciosamente ignorada.

    Tendo dito tudo isso, sua única escolha entre cercado e não cercado é com rotinas C/C++. Normalmente, você executaria o modo protegido por segurança, mudando para o modo não limitado apenas quando tiver certeza de que eles não podem prejudicar o gerenciador de banco de dados e precisam de maior desempenho 1 .


    1 - A diferença de desempenho entre rotinas protegidas e não protegidas vem da sobrecarga associada à alocação de um processo protegido, bem como das comunicações entre processos entre o gerenciador de banco de dados e a rotina não protegida. Mesmo assim, o processo protegido não é criado toda vez que uma rotina protegida é chamada; um conjunto deles será criado e reutilizado para tais chamadas. Tudo isso significa que você pode ver o benefício de declarar uma rotina como limitada apenas se essa rotina for chamada com muita frequência (como dezenas de vezes por segundo ou mais).

    • 5
  2. Chris Travers
    2013-03-10T03:44:52+08:002013-03-10T03:44:52+08:00

    Tanto quanto eu posso dizer, você está quase certo. A chave é que as funções PL SQL não podem fazer alocação de memória e, portanto, não há como tratá-las especialmente em relação ao gerenciamento de memória. Em essência, o PL/SQL está intimamente ligado ao mecanismo de banco de dados, mas o gerenciamento de memória é responsabilidade do mecanismo de banco de dados, não dos procedimentos armazenados.

    Em geral, minhas recomendações seriam para código extensivamente testado e/ou revisado com um histórico muito bom, destinado ao uso em sistemas de alto desempenho, não protegido faz mais sentido. No entanto, os bancos de dados são importantes e algo como uma saturação de buffer pode causar corrupção de dados que pode passar despercebida por algum tempo. Minha recomendação seria executar todos os procs armazenados em C/C++/Java protegidos, a menos que você tenha certeza de que precisa de outra forma.

    O mesmo vale para UDFs.

    • 4

relate perguntas

  • Como descubro se existe um procedimento ou função em um banco de dados mysql?

  • Alguém está usando o recurso do SQL Server para criar grupos de stored procedures diferenciadas por número?

  • SQL dinâmico em rotinas armazenadas do MySQL

  • Qual é a configuração RAID recomendada para um banco de dados Oracle?

  • Melhores práticas para conectar bancos de dados que estão em diferentes regiões geográficas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve