Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Where子句参数比字符串文字快。我怎么修理?_Sql Server 2008_Tsql_Parameter Sniffing - Fatal编程技术网

Sql server 2008 SQL Where子句参数比字符串文字快。我怎么修理?

Sql server 2008 SQL Where子句参数比字符串文字快。我怎么修理?,sql-server-2008,tsql,parameter-sniffing,Sql Server 2008,Tsql,Parameter Sniffing,创建以下脚本以加载用户帐户。在ManagementStudio的初始测试中使用用户名的参数字符串。奇怪的是,在我将参数字符串更改为字符串文字后,查询速度减慢了20秒。这不是通常用于参数嗅探的另一种方法吗?我尝试过DBCC FREEPROCCACHE并创建了一个带有一些本地变量的存储过程,但这并没有加快查询速度。有什么建议吗 DECLARE @accntRep VARCHAR(50) SET @accntRep = 'someUserName' SELECT accntRep,transBal

创建以下脚本以加载用户帐户。在ManagementStudio的初始测试中使用用户名的参数字符串。奇怪的是,在我将参数字符串更改为字符串文字后,查询速度减慢了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]
字段上确实存在索引),那么听起来您的统计数据已经过时了。至少要更新统计数据。或者,您可以重新生成索引,只要索引未分区,该索引将包含一个带有FULLSCAN的统计数据更新
(在SQL Server 2012之前,分区索引也会收到完整的统计数据更新)。

重新生成索引有效。我觉得有点傻。谢谢你指出这一点。重建索引成功了。我应该先检查一下。谢谢你的帮助。由于该索引在周日刚刚重建,所以我不想尝试这样做。