O SQL Server basicamente passa por essas etapas para executar qualquer query (chamada de procedimento armazenado ou instrução SQL ad-hoc):
1) verifique sintaticamente a consulta
2) se está tudo bem - verifica o cache do plano para ver se já possui um plano de execução para essa consulta
3) se existe um plano de execução - esse plano é ( re-)usado e a consulta executada
4) se ainda não houver plano, um plano de execução é determinado
5) esse plano é armazenado no cache do plano para reutilização posterior
6) o a consulta é executada
O ponto é:SQL ad-hoc e procedimentos armazenados não são de maneira diferente .
Se uma consulta SQL ad-hoc estiver usando parâmetros corretamente - como deveria, de qualquer forma, para evitar ataques de injeção de SQL - suas características de desempenho não são diferentes e definitivamente não são piores do que executar um procedimento armazenado.
O procedimento armazenado tem outros benefícios (não há necessidade de conceder aos usuários acesso direto à tabela, por exemplo), mas em termos de desempenho, usar consultas SQL ad-hoc adequadamente parametrizadas é tão eficiente como usando procedimentos armazenados.
Atualização: usando procedimentos armazenados em não parametrizados consultas é melhor por dois motivos principais:
-
já que cada consulta não parametrizada é um novo, diferente consulta ao SQL Server, ele precisa passar por todas as etapas de determinação do plano de execução, para cada consulta (perdendo assim tempo - e também desperdiçando espaço de cache do plano, pois armazenar o plano de execução no cache do plano não ajuda muito no final , já que essa consulta específica provavelmente não ser executado novamente)
-
consultas não parametrizadas correm o risco de ataque de injeção de SQL e devem ser evitadas a todo custo