SQL Where子句参数比字符串文字快。我该如何解决?

时间:2015-01-14 12:55:57

标签: sql-server-2008 tsql parameter-sniffing

创建以下脚本以加载用户帐户。在管理工作室的初始测试中使用了用户名的参数字符串。奇怪的是,在我从参数字符串更改为字符串文字后,查询减慢了20秒。参与嗅探通常不是另一种方式吗?我尝试过DBCC FREEPROCCACHE并创建一个存储过程来设置一些本地变量,但这并没有加快查询速度。有什么建议吗?

DECLARE @accntRep VARCHAR(50)
SET @accntRep = 'someUserName'

SELECT  accntRep,transBalance FROM companyView AS cv
OUTER APPLY 
    (SELECT SUM(CASE WHEN pastdue > 0 THEN balance ELSE 0 END) AS pastDueBalance,
      SUM(balance) AS transBalance FROM pastDueView WHERE compID = cv.compID
    ) AS balance
WHERE 
--  accntRep = @accntRep   
accntRep = 'someUserName'
GROUP BY accntRep,transBalance

1 个答案:

答案 0 :(得分:2)

字符串文字和局部变量之间的差异通常是统计数据的问题,其中使用局部变量使用平均分布。因此,如果平均值优于实际统计数据(假设[accntRep]字段上存在索引),那么听起来您的统计数据已经过时了。至少更新统计数据。或者您可以执行索引的重建,只要索引未分区,就会包含统计信息更新WITH FULLSCAN(在SQL Server 2012之前,分区索引也会收到完整的统计信息更新)。