I have a stored procedure with some parameters (I've used generic type and name, just for the example). When I have it like the code bellow, it runs in two minutes:
create procedure [dbo].[name]
@param1 type,
@param2 type,
@param3 type,
@param4 type,
@param5 type,
@param6 type
as
begin
SELECT
COLUMNS
from
table1 t1
inner join table2 t2 on t1.id = t2.j_id
left join table3 t3 pn t2.column3 = t3.id
............
where
(@param1 is null or @param1 = some_column)
and (@param1 is null or @param1 = some_column)
and (@param1 is null or @param1 = some_column)
and (@param1 is null or @param1 = some_column)
and (@param1 is null or @param1 = some_column)
and (@param1 is null or @param1 = some_column)
end
But if I change the code and declare variables and use them in query, it runs in a second. Why?
Here is the "optimised" code:
create procedure [dbo].[name]
@param1 type,
@param2 type,
@param3 type,
@param4 type,
@param5 type,
@param6 type
as
begin
declare
@var1 type = @param1,
@var2 type = @param2,
@var3 type = @param3,
@var4 type = @param4,
@var5 type = @param5,
@var6 type = @param6
SELECT
COLUMNS
from
table1 t1
inner join table2 t2 on t1.id = t2.j_id
left join table3 t3 on t2.column3 = t3.id
............
where
(@var1 is null or @var1 = some_column)
and (@var2 is null or @var2 = some_column)
and (@var3 is null or @var3 = some_column)
and (@var4 is null or @var4 = some_column)
and (@var5 is null or @var5 = some_column)
and (@var6 is null or @var6 = some_column)
end
Why the second version of stored procedure runs much faster?
OPTION (RECOMPILE)orOPTION(OPTIMIZE FOR @par = UNKNOWN...