今天,我又遇到了一个重大问题,似乎是 SQL Server 2005 中的参数嗅探。
我有一个查询将一些结果与已知的良好结果进行比较。我在结果和已知的好结果中添加了一个列,这样每个月,我都可以在两边加载一个新的月份结果,并且只比较当前月份。新列在聚集索引中排在第一位,因此新的月份将添加到末尾。
我在我的子句中添加了一个条件WHERE
- 这是代码生成的,所以它是一个字面常量:
WHERE DATA_DT_ID = 20081231
-- 这是多余的,因为所有 DATA_DT_ID 现在都是 20081231。
性能进入底池。从 7 秒比较大约 150 万行到 2 小时,但什么也没完成。在 SSMS 中运行生成的 SQL - 没有 SP。
我使用 SQL Server 已有 12 年了,自 10 月以来,我从未在此生产服务器上遇到过如此多的参数嗅探问题(构建版本 9.00.3068.00)。在每种情况下,这都不是因为它第一次运行时使用了不同的参数或表发生了变化。这是一个新表,它仅使用此参数运行或根本没有WHERE
子句。
而且,不,我没有 DBA 访问权限,而且他们没有给我足够的权限来查看执行计划。
以至于我不确定我是否能够将这个系统交给只有几年经验的 SQL Server 用户处理。
UPDATE事实证明,尽管统计数据声称是最新的,但运行 UPDATE STATISTICS WITH FULLSCAN 可以解决问题。
最终更新即使使用 WITH RECOMPILE 和 UPDATE STATISTICS 重新创建 SP,结果还是必须以不同的方式重写查询,以使用 NOT IN 而不是 LEFT JOIN 和 NULL 检查。