Eficiência de procedimentos armazenados versus consultas brutas


23

Eu li muito sobre os dois lados deste debate: existe um ganho significativo de desempenho usando apenas procedimentos armazenados em consultas brutas? Estou especificamente interessado no SQL Server, mas estaria interessado em todo e qualquer banco de dados.


2
Você pode postar links para algumas das coisas que você leu? Eu não acho que o desempenho está em jogo aqui (pelo menos não diretamente)
— Jack Douglas

1
@JackDouglas, confira a resposta de mrdenny. O desempenho faz parte dessa pergunta / resposta.
— Thomas Stringer

Respostas:


31

É menos no SQL Server 2008 e superior, mas ainda está lá. O que se resume é o cache do plano de execução e o SQL Server poder parametrizar automaticamente as consultas enviadas. Ao usar procedimentos armazenados (que não possuem SQL dinâmico), as consultas já estão parametrizadas para que o SQL Server não ' não é necessário gerar um plano para cada consulta quando ela for executada, pois os planos já estão armazenados no cache do plano.

E não se esqueça dos problemas de segurança (SQL dinâmico, permissões mínimas etc.) que desaparecem ao usar procedimentos armazenados.

Quando o aplicativo está usando SQL dinâmico nas tabelas base para selecionar, inserir, atualizar e excluir os dados nas tabelas, o aplicativo precisa ter direitos sobre todos esses objetos diretamente. Portanto, se alguém usar o SQL Injection para acessar o servidor, ele terá o direito de consultar, alterar ou excluir todos os dados nessas tabelas.

Se você estiver usando procedimentos armazenados, eles terão apenas o direito de executar os procedimentos armazenados, retornando apenas as informações que o procedimento armazenado retornaria. Em vez de emitir uma instrução de exclusão rápida e remover tudo, eles precisariam descobrir quais procedimentos podem ser usados ​​para excluir dados e descobrir como usar o procedimento para fazer isso.

Dado que a injeção de SQL é a maneira mais fácil de invadir um banco de dados, isso é meio importante.


@mrdenny - você pode obter o mesmo efeito com "consultas brutas" se elas forem parametrizadas?
— Jack Douglas

Sim, se eles estiverem totalmente parametrizados. No entanto, isso não resolve os problemas de segurança que são resolvidos com os procedimentos armazenados.
— mrdenny

10

Como um adendo à resposta de Denny, não é incomum encontrar sistemas em que uma memória significativa do buffer pool é desperdiçada em planos de execução ad-hoc de uso único ou baixo, criados como resultado de consultas sendo usadas em procs.

Nos piores casos recentemente, 8 GB alocados a uma instância, cache de plano de 3 GB, planos de uso único de 2,5 GB. A maioria deles foi o SQL2005, portanto, não foi uma opção tentar a configuração de otimização para cargas de trabalho ad-hoc.

Certamente está ficando mais difícil incluir desempenho em uma justificativa para procedimentos em consultas brutas. Um dos argumentos mais fortes para mim agora é "Se você usa procedimentos, é muito mais fácil para mim ajudar quando surgem problemas de desempenho". Uma interface dinâmica / linq / orm não impede o ajuste, mas pode limitar severamente suas opções.


Há um excelente artigo relacionado aqui, incluindo scripts para excluir esses planos de uso único. sqlskills.com/blogs/kimberly/...
— SomeGuy

7

O SQL Server armazena em cache e otimiza os procedimentos armazenados e o SQL ad-hoc da mesma maneira. Por exemplo, este procedimento:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

Será otimizado e armazenado em cache de forma idêntica para:

select * from Orders where id = @id

No entanto, o seguinte SQL ad-hoc não pode ser armazenado em cache efetivamente, devido ao valor codificado:

select * from Orders where id = 42

Embora o desempenho seja o mesmo, existem boas razões para usar procedimentos armazenados. Os procedimentos armazenados fornecem uma separação clara entre o DBA e os desenvolvedores de aplicativos. É bom ter uma camada extra de defesa entre seus dados valiosos e programas em constante mudança :)


+1 especialmente se você forçar todo o acesso a passar por suas SPs e eles são bem pensado como uma API transacional não apenas uma camada CRUD
— Jack Douglas

Em mais de 2008, a id = 42consulta pode ser otimizada usando o mesmo plano, dependendo das configurações de parametrização simples / forçada. Obviamente, as consultas devem ser adequadamente parametrizadas. :-)
— Aaron Bertrand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.