TSQL查询和存储过程执行后的读取数量明显不同

时间:2012-10-22 11:18:54

标签: sql sql-server tsql stored-procedures query-optimization

在查询优化之后,我得到的结果还可以,我想改变存储过程,但是在执行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!

维迪奇

2 个答案:

答案 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问题。就个人而言,我喜欢虚拟变量选项来解决这个问题,并且(只有当我遇到这个问题时)创建设置为传入参数值的变量。