it-swarm-pt.tech

Por que executar procedimentos armazenados é mais rápido que a consulta SQL de um script?

De fato, se eu chamar os procedimentos armazenados do meu aplicativo, preciso de uma conexão com meu banco de dados.

Então, por que chamar um "procedimento armazenado" deve ser mais rápido do que executar uma string "passando uma consulta SQL"?

21
markzzz

O SQL Server basicamente executa essas etapas para executar a consulta qualquer (chamada de procedimento armazenado ou instrução SQL ad-hoc):

1) verifique sintaticamente a consulta
2) se estiver tudo bem - ele verifica o cache do plano para ver se já possui um plano de execução para essa consulta
3) se houver um plano de execução - esse plano é (re) utilizado e a consulta executada
4) se ainda não houver plano, é determinado um plano de execução
5) esse plano é armazenado no cache do plano para reutilização posterior
6) a consulta é executada

O ponto é: SQL ad-hoc e procedimentos armazenados são tratados não de maneira diferente.

Se uma consulta SQL ad-hoc estiver usando corretamente parâmetros - como deveria, para impedir ataques de injeção de SQL -, suas características de desempenho não serão diferentes e, definitivamente, não é pior do que a execução de um procedimento armazenado.

O procedimento armazenado tem outros benefícios (não é necessário conceder aos usuários acesso direto à tabela, por exemplo), mas em termos de desempenho, o uso de consultas SQL ad-hoc parametrizadas corretamente é tão eficiente quanto o uso de procedimentos armazenados.

Atualização: o uso de procedimentos armazenados em não parametrizado consultas é melhor por dois motivos principais:

  • como cada consulta não parametrizada é uma consulta nova, diferente para o SQL Server, ela precisa seguir todas as etapas para determinar o plano de execução, para cada consulta (perdendo tempo - e também desperdiçando cache do plano) espaço, já que armazenar o plano de execução no cache do plano não ajuda muito no final, pois essa consulta em particular provavelmente não será executada novamente)

  • consultas não parametrizadas correm risco de ataque de injeção de SQL e devem ser evitadas a todo custo

57
marc_s

Como toda vez que você passa uma string de consulta para o SQL Server, o código precisa ser compilado etc., os procedimentos armazenados já estão compilados e prontos para execução no servidor.

Além disso, você está enviando menos dados pela rede, embora isso geralmente tenha um impacto mínimo.

EDIT: Como uma observação, os procedimentos armazenados têm outros benefícios.

1) Segurança - Como a consulta real é armazenada no servidor, você não a transmite pela rede, o que significa que qualquer pessoa que intercepte o tráfego da rede não obtém nenhuma percepção da estrutura da sua tabela. Um SP bem projetado evita ataques de injeção.

2) Separação de código, você mantém o código do seu banco de dados e o código do seu aplicativo, existe muito pouco crossover e acho que isso torna a correção de bugs muito melhor.

3) Manutenção e reutilização de código, você pode reutilizar um procedimento várias vezes sem precisar copiar e colar a consulta, também se desejar atualizar a consulta, basta atualizá-la em um único local.

4) tráfego de rede diminuído. Como mencionado acima, isso pode não ser um problema para a maioria das pessoas, mas com um aplicativo grande, você pode reduzir significativamente a quantidade de dados transferidos pela sua rede, passando a usar os procedimentos armazenados.

7
Purplegoldfish

Sua afirmação de que os procedimentos armazenados são mais rápidos que as consultas SQL é apenas parcialmente verdadeira. Para explicar: A maioria dessas respostas já explica que, com procedimentos armazenados, um plano de consulta é gerado e armazenado em cache. Portanto, se você chamar o procedimento armazenado novamente, o mecanismo SQL pesquisará primeiro sua lista de planos de consulta e, se encontrar uma correspondência, utilizará o plano otimizado.

A aprovação de uma consulta normal não oferece essa vantagem, pois o mecanismo SQL não sabe o que esperar e, portanto, não pode encontrar uma correspondência para sua consulta. Ele cria um plano a partir do zero e, em seguida, renderiza seus resultados.

Boas notícias: você pode ativar o armazenamento em cache planejado para suas consultas usando as consultas parametrizadas, um novo recurso do SQL. Isso permite gerar planos para suas consultas e pode ser muito eficaz em sua situação, pois a maioria das consultas que você passa do código permanece a mesma, exceto principalmente pelas variáveis ​​na cláusula Where. Há também uma configuração em que você pode forçar a parametrização para todas as suas consultas. Pesquise este tópico no MSDN e ajude você a decidir o que é melhor.

No entanto, dito isso, os procedimentos armazenados continuam sendo uma boa maneira de interagir com o banco de dados de seus aplicativos, pois fornece uma camada de segurança adicional.

Espero que isso tenha sido útil!

4
Charl

Outros problemas que foram superados, comparam o tráfego de rede entre o servidor da Web e o servidor de banco de dados deste-

exec someproc @ var1 = 'blá', @ var2 = 'blá', @ var3 = 'blá'

Para isso-

Selecione campo1, campo2, campo3, campo4, campo5, campo6 .... campo30 junte-se à tabela1 na tabela2.field12 = tabela1.field12 em que blá blá blá e tabela1.field3 = @ var1 e table2.field44 = @ var2 e (table1.field1 é nulo ou table1.field1 = @ var3 .......

Veja a diferença? Para 99% de nós, isso provavelmente não importa, mas para alguns de vocês que escrevem aplicativos de alto desempenho isso pode acontecer, embora haja provavelmente algum cache ou outras formas de lidar com isso.

Eu acho que muitas pessoas que afirmam que não há diferença entre consultas adhoc e procedimentos armazenados geralmente usam tabelas como repositórios de objetos para qualquer ORM que estejam usando, e isso é bom. Ainda existem muitos aplicativos empresariais baseados em dados pesados, com ou sem razão, que possuem mais de 1000 procedimentos armazenados de linha. Você pode acabar trabalhando neles. Além disso, para aqueles que talvez precisem fazer alterações na produção de vez em quando e precisem ignorar o processo formal, é muito mais fácil fazer isso no banco de dados do que no código compilado de produção. Alter proc ... feito. Cowboy, horrível, mau, acontece. Sim, eu sei que fazer isso é um pecado imperdoável em muitas de suas mentes, sinal de descamação ... mas acontece. Apenas algo em que pensar também.

Sei que as ferramentas mais recentes geralmente tornam o uso de procs armazenados uma dor na parte traseira se você espera que todas as suas entidades sejam geradas de maneira agradável para você, mas os procs armazenados ainda têm seu lugar às vezes.

2
infocyde

procedimentos armazenados são compilados e armazenados em cache. Porém, as instruções SQL serão comparadas aos planos de execução existentes e, se houver uma correspondência presente, anulando, de certa forma, qualquer vantagem.

Qual é a diferença real de desempenho após várias execuções?

1
NimChimpsky
  1. Os procedimentos armazenados às vezes são executados um pouco mais rápido porque ou usando chamadas RPC quando possível
  2. O SP roda mais rápido para consultas que precisam ser recompiladas - por exemplo, - usando criações de tabelas temporárias em algum lugar no meio
0
Oleg Dok

Diferentemente das instruções SQL padrão, os procedimentos armazenados são compilados e otimizados pelo servidor de banco de dados. Essa otimização envolve o uso de informações sobre a estrutura de um banco de dados específico, necessárias no momento da execução pelo procedimento armazenado. Esse processo de armazenamento de informações de execução (o plano de execução) economiza muito tempo, principalmente se o procedimento armazenado for chamado várias vezes.

A velocidade também é aprimorada pelo fato de os procedimentos armazenados serem executados inteiramente no servidor de banco de dados - não é necessário passar grandes pedaços de código SQL por uma rede. Para uma instrução SELECT simples, que pode não fazer uma grande diferença, mas nos casos em que realizamos uma série de loops e cálculos, ela pode ter um efeito significativo.

0
Gaurav Agrawal

Este artigo explica muito bem: https://codingsight.com/dynamic-sql-vs-stored-procedure/

Pela minha experiência, os procedimentos armazenados são definitivamente mais rápidos, devido à diminuição do tráfego na rede (não é necessário enviar toda a consulta) e ao cache do procedimento e dos planos de consulta.

Eu executei um código semelhante ao seguinte em uma tabela preenchida com dados de logon do usuário.

"selecione o top 1 * em Logons em que ComputerName = @ ComputerName faça o pedido por LogonTime desc"

Demorou 2 horas para executar a consulta em 7000 nomes de computadores.

Quando coloquei a consulta em um procedimento armazenado, demorou cerca de um minuto para executar em 7000 nomes de computadores.

Estou certo de que levar 1 segundo vs 10 milissegundos por consulta não faz grande diferença para os seres humanos se você estiver executando a consulta apenas uma vez. No entanto, se você precisar executar a consulta mil vezes, é uma diferença de 1000 segundos (aproximadamente 16 min) vs 10 segundos.

0
WWC