Этот код проще поместить в новый ответ, чем в комментарий, но это показывает немного того, что говорит Ремус:
CREATE PROCEDURE dbo.Test_Params
@param1 INT
WITH RECOMPILE
AS
BEGIN
SELECT
o.object_id,
c.object_id
FROM
sys.objects o
LEFT OUTER JOIN sys.columns c ON
c.object_id = o.object_id AND
@param1 = 1
OPTION
(RECOMPILE)
END
GO
EXEC dbo.Test_Params 1
EXEC dbo.Test_Params 2
Если вы создадите план выполнения для двух операторов EXEC, вы увидите, что sys.columns появляется в обоих планах выполнения, но во втором все строки фильтруются перед выполнением объединения. Обратите внимание, что они не полностью закорочены в запросе.