【问题标题】:SQL Where clause parameter faster than string literal. How do I fix?SQL Where 子句参数比字符串文字快。我该如何解决?
【发布时间】:2015-03-12 16:02:15
【问题描述】:

创建了以下脚本来加载用户帐户。在管理工作室的初始测试中使用参数字符串作为用户名。奇怪的是,在我从参数字符串更改为字符串文字后,查询速度减慢了 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

【问题讨论】:

  • 重建索引工作。我觉得有点傻。感谢您指出这一点。

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


【解决方案1】:

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

【讨论】:

  • 重建索引工作。应该先检查一下。谢谢您的帮助。由于索引是星期天刚刚重建的,所以我没有想过要尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2014-09-26
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
相关资源
最近更新 更多