Eu tive o mesmo problema que o pôster original, mas a resposta citada não resolveu o problema para mim. A consulta ainda ficou muito lenta em um procedimento armazenado.
Encontrei outra resposta aqui "Parameter Sniffing", Obrigado Omnibuzz. Resumindo-se ao uso de "variáveis locais" em suas consultas de procedimento armazenado, mas leia o original para mais compreensão, é uma ótima redação. por exemplo.
Modo lento:
CREATE PROCEDURE GetOrderForCustomers(@CustID varchar(20))
AS
BEGIN
SELECT *
FROM orders
WHERE customerid = @CustID
END
Maneira rápida:
CREATE PROCEDURE GetOrderForCustomersWithoutPS(@CustID varchar(20))
AS
BEGIN
DECLARE @LocCustID varchar(20)
SET @LocCustID = @CustID
SELECT *
FROM orders
WHERE customerid = @LocCustID
END
Espero que isso ajude alguém, fazendo isso reduziu meu tempo de execução de 5+ minutos para cerca de 6-7 segundos.