1

我遇到了一个问题,其中包含大约 70 个参数的更新查询有时会超时。根据一些研究,我相信这是由于数据包嗅探。我看到在较新版本的 SQL Server 中,我可以使用该Option(recompile)子句,但在我的情况下这不起作用,因为我使用的是服务器 2000。

我正在使用sqlhelper.executeNonQuery而不是存储过程。

4

2 回答 2

3

据我所知,没有像 一样的“开箱即用”方式Option(recompile),但我记得我找到了一种欺骗优化器的方法。它似乎只嗅探您实际上在查询外部传递的参数,而不是全部。所以,如果你尝试运行

SELECT MyField1, MyField2 FROM MyTable WHERE MyOtherField = @MyParm

参数嗅探会发生,但是如果你写类似的东西

DECLARE @MyUnsniffableParm varchar(30)
SET @MyUnsinffableParm = @MyParm    
SELECT MyField1, MyField2 FROM MyTable WHERE MyOtherField = @MyUnsniffableParm

广告当然只是将@MyParm参数传递给您的脚本,参数嗅探似乎没有发生!让我知道如果我没记错的话,我没有可尝试的 SQL 2000 实例!
编辑:
看起来其他东西在这里做同样的事情:http: //blogs.msdn.com/b/khen1234/archive/2005/06/02/424228.aspx

于 2012-10-30T17:45:20.327 回答
1

一个简单的解决方法是不使用参数。代替:

SELECT * FROM YourTable WHERE UserName = @myUserName;

经过:

SELECT * FROM YourTable WHERE UserName = 'PFranchise'

如果 SQL Server 不知道参数,它就无法嗅探它们!SQL Server 将为每个查询重新编译查询计划。

关于这种方法的两个注意事项:

  • 小心 SQL 注入
  • 在更高版本的 SQL Server 中,服务器选项“强制参数化”甚至可以嗅探没有参数的查询。默认情况下它是关闭的。但是在升级 SQL Server 时要牢记这一点。
于 2012-10-30T17:44:29.777 回答