在查询优化之后,我得到的结果还可以,我想改变存储过程,但是在执行SP后得到的结果比查询执行后得多!
首先,我认为阅读次数。结果如此不同的原因是什么?
查询与SP中的相同,唯一的区别在于查询中我声明的参数,但在SP中是输入参数。设置为参数的值也相同。为了避免“记录数据”,我首先重新编译了SP,然后完成了DROP和CREATE,但结果也大不相同。
查询是这样的(由于简化而更改了表名和列名,并减少了列数):
DECLARE @Var1 varchar(20)
SET @Var1 = @Var1 + '%'
DECLARE @Var2 TIMESTAMP
SELECT @Var2 = CONVERT(TIMESTAMP, ID, 0)
FROM
X_TIMESTAMPS (NOLOCK)
WHERE
TABLE = 'T1'
declare @Var3 varbinary(8)
SELECT @Var3 = max(IdTimeStamps)
FROM
T1 (NOLOCK)
SELECT o.c1
, o.c2
, o.c3
, v.c4
, v.c5
, p.c6
, p.c7
, va.c8
, isnull(s.c9, '') AS c9
, CASE o.c10
WHEN 1 THEN
0
ELSE
1
END c10
, o.c11
FROM
T1 o (NOLOCK)
JOIN T2 p (NOLOCK)
ON o.c1 = p.c12
JOIN T3 i (NOLOCK)
ON (o.c13 = i.c14)
JOIN T4 v (NOLOCK)
ON (v.c4 = i.c15)
LEFT JOIN T5 s (NOLOCK)
ON (o.c16 = s.c17)
JOIN T6 va (NOLOCK)
ON o.c11 = va.c18
WHERE
o.c1 LIKE @Var1
AND o.c2 > @Var2
程序是这样的:
CREATE PROCEDURE [dbo].[SP1] @Var1 varchar(20) =''
WITH RECOMPILE
AS
BEGIN
PREVIOUS QUERY WITHOUT DECLARATION FOR @Var1
END
提前TnX!
维迪奇
答案 0 :(得分:2)
这是因为不同的执行计划用于查询常量,sp用于参数。你可以尝试一些技巧
创建内联表函数并尝试
create function sf_test
(
@param1 int
)
returns table
as
return
your query using @in_param1
或
在您的程序中声明其他参数,例如
create procedure sp_test
(
@param1 int
)
as
begin
declare @in_param1 int
select @in_param1 = @param1
your query using @in_param1
end
您也可以尝试在过程中使用选项with recompile
,或使用动态SQL
答案 1 :(得分:2)
这几乎肯定是parameter sniffing问题。就个人而言,我喜欢虚拟变量选项来解决这个问题,并且(只有当我遇到这个问题时)创建设置为传入参数值的变量。