我遇到了一个问题,其中包含大约 70 个参数的更新查询有时会超时。根据一些研究,我相信这是由于数据包嗅探。我看到在较新版本的 SQL Server 中,我可以使用该Option(recompile)
子句,但在我的情况下这不起作用,因为我使用的是服务器 2000。
我正在使用sqlhelper.executeNonQuery
而不是存储过程。
我遇到了一个问题,其中包含大约 70 个参数的更新查询有时会超时。根据一些研究,我相信这是由于数据包嗅探。我看到在较新版本的 SQL Server 中,我可以使用该Option(recompile)
子句,但在我的情况下这不起作用,因为我使用的是服务器 2000。
我正在使用sqlhelper.executeNonQuery
而不是存储过程。
据我所知,没有像 一样的“开箱即用”方式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
一个简单的解决方法是不使用参数。代替:
SELECT * FROM YourTable WHERE UserName = @myUserName;
经过:
SELECT * FROM YourTable WHERE UserName = 'PFranchise'
如果 SQL Server 不知道参数,它就无法嗅探它们!SQL Server 将为每个查询重新编译查询计划。
关于这种方法的两个注意事项: