OK, já tivemos problemas semelhantes como este antes.
A maneira como corrigimos isso foi fazendo parâmetros locais dentro do SP, de modo que
DECLARE @LOCAL_Contract_ID int,
@LOCAL_dt_From smalldatetime,
@LOCAL_dt_To smalldatetime,
@LOCAL_Last_Run_Date datetime
SELECT @LOCAL_Contract_ID = @Contract_ID,
@LOCAL_dt_From = @dt_From,
@LOCAL_dt_To = @dt_To,
@LOCAL_Last_Run_Date = @Last_Run_Date
Em seguida, usamos os parâmetros locais dentro do SP em vez dos parâmetros que foram passados.
Isso normalmente corrigiu o problema para nós.
Acreditamos que isso seja devido ao sniffing de parâmetros, mas não temos nenhuma prova, desculpe... X-)
EDITAR:
Dê uma olhada em Diferentes abordagens para corrigir a detecção de parâmetros do SQL Server para alguns exemplos perspicazes, explicações e correções.