SQL Server中的参数嗅探(或欺骗)
不久前,我有一个查询,我为我的一个用户运行了相当多的查询。它仍然在进化和调整,但最终它的建立和运行速度相当快,所以我们用它创建了一个存储过程。
到目前为止还很正常。
然而,存储过程是缓慢的。查询和proc之间没有实质区别,但速度变化很大。
[背景,我们正在运行SQLServer 2005。]
一个友好的本地DBA(不再在这里工作)看了一下存储过程,说:“参数欺骗!”编辑:虽然它似乎也可能被称为“参数嗅探”,但这或许可以解释为什么当我试图搜索它时,谷歌点击率很低。)
我们将一些存储过程抽象为第二个存储过程,将对这个新的内部过程的调用封装到先前存在的外部过程中,称为外部过程,并且,嘿,presto,它与原始查询一样快。
那么,是什么原因呢?有人能解释参数欺骗吗?
奖金信贷
- 突出强调如何避免
- 建议如何识别可能的原因
- 讨论其他策略,例如统计数据、索引、键,以缓解这种情况。