不久前,我有一个查询,我为我的一个用户运行了很多。它仍在不断发展和调整,但最终稳定下来并运行得非常快,因此我们从中创建了一个存储过程。
到目前为止,一切正常。
但是,存储过程很慢。查询和proc之间没有实质性区别,但速度变化很大。
[背景,我们正在运行 SQL Server 2005。]
一位友好的本地 DBA(不再在这里工作)看了一眼存储过程并说“参数欺骗!” (编辑:虽然它似乎也可能被称为“参数嗅探”,这可能解释了当我试图搜索它时谷歌点击量的缺乏。)
我们将一些存储过程抽象为第二个存储过程,将对这个新的内部过程的调用包装到预先存在的外部过程中,称为外部过程,嘿,转眼间,它与原始查询一样快。
那么,什么给了?有人可以解释参数欺骗吗?
奖励积分
- 强调如何避免它
- 建议如何识别可能的原因
- 讨论缓解情况的替代策略,例如统计数据、索引、键