Cad*_*oux 5 sql sql-server sql-server-2005 parameter-sniffing
今天再次,我有一个主要问题,似乎是SQL Server 2005中的参数嗅探.
我有一个查询将一些结果与已知的良好结果进行比较.我在结果和已知的良好结果中添加了一列,因此每个月,我可以在双方加载新月结果并仅比较当前月份.新列首先出现在聚簇索引中,因此新月将添加到结尾.
我为my WHERE子句添加了一个标准- 这是代码生成的,所以它是一个文字常量:
WHERE DATA_DT_ID = 20081231 - 这是多余的,因为所有DATA_DT_ID现在都是20081231.
性能进入底池.从7秒开始比较大约1.5米行到2小时并没有完成任何事情.在SSMS中运行生成的SQL权限 - 没有SP.
我一直在使用SQL Server已经12年了,我从来没有遇到过如此多的参数嗅探问题,就像我自10月以来在这个生产服务器上所做的那样(构建版本9.00.3068.00).并且在每种情况下,都不是因为它是第一次使用不同的参数运行或表格已更改.这是一个新表,它只使用此参数或根本没有WHERE子句运行.
而且,不,我没有DBA访问权限,他们没有给我足够的权利来查看执行计划.
到目前为止,我不确定我是否能够只用几年的经验将这个系统交给SQL Server用户.
更新事实证明,虽然统计数据声称是最新的,但运行UPDATE STATISTICS WITH FULLSCAN可以解决问题.
最终更新即使重新创建SP,使用WITH RECOMPILE和UPDATE STATISTICS,结果是必须以不同的方式重写查询以使用NOT IN而不是使用NULL检查LEFT JOIN.
不是一个答案,但我会分享我的经验.
参与嗅探花费了几年的时间来讨论SQL Server,当我回到开发人员DBA之后,大部分时间都在推动DBA的工作.我更了解引擎,SQL如何工作,最好留给客户端等等,我是一个更好的SQL编码器.
例如,动态SQL或CURSOR或只是普通的错误SQL代码可能不会遭受参数嗅探.但更好的设置编程或如何避免动态SQL或更优雅的SQL更有可能.
我注意到复杂的搜索代码(大量的条件)和复杂的报告,其中参数默认值影响了计划.当我看到经验不足的开发人员如何编写此代码时,它将不会遭受参数嗅探.
无论如何,我更喜欢参数掩蔽和WITH RECOMPILE.更新统计信息或索引会强制重新编译.但为什么要一直重新编译?我已经在其他地方回答了你的一个问题,其中一个链接提到参数在编译过程中被嗅探,所以我也不相信它.
参数屏蔽是一种开销,是的,但它允许优化器逐个评估查询,而不是全面重新编译.特别是SQL Server 2005的语句级重新编译
SQL Server 2008中的UNKNOWN OPTIMIZE似乎也与屏蔽完全相同.我的SQL Server MVP同事和我花了一些时间进行调查并得出了这个结论.