SQL Where 子句参数比字符串文字更快。我该如何解决?
SQL Where clause parameter faster than string literal. How do I fix?
创建了以下脚本来加载用户帐户。在管理工作室的初始测试中使用了用户名的参数字符串。奇怪的是,在我从参数字符串更改为字符串文字后,查询速度减慢了 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
字符串文字和局部变量之间的区别通常是统计问题,其中使用局部变量使用平均分布。因此,如果平均值优于实际统计数据(假设 [accntRep]
字段中确实存在索引),那么听起来您的统计数据已过时。至少更新统计数据。或者您可以重建索引,只要索引未分区,就会包含统计更新 WITH FULLSCAN
(在 SQL Server 2012 之前,分区索引也会收到完整的统计更新) .
创建了以下脚本来加载用户帐户。在管理工作室的初始测试中使用了用户名的参数字符串。奇怪的是,在我从参数字符串更改为字符串文字后,查询速度减慢了 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
字符串文字和局部变量之间的区别通常是统计问题,其中使用局部变量使用平均分布。因此,如果平均值优于实际统计数据(假设 [accntRep]
字段中确实存在索引),那么听起来您的统计数据已过时。至少更新统计数据。或者您可以重建索引,只要索引未分区,就会包含统计更新 WITH FULLSCAN
(在 SQL Server 2012 之前,分区索引也会收到完整的统计更新) .