0

有人可以解释为什么这有效。这里是风景。我有一个存储过程,它开始运行缓慢。然后我选择一个参数并声明一个变量来容纳它的值,并在 proc 中使用声明的变量而不是参数。然后proc将大大加快。

我认为这与缓存的计划和统计信息有关,但我不确定。统计数据是否会随着数据库的增长和变化而过时,以便缓存计划针对与数据当前状态不同的数据过去状态进行优化?

谢谢。

4

2 回答 2

4

您所描述的通常被称为参数嗅探,它似乎是 SQL Server 唯一的问题 - 在 Oracle IME 上从未遇到过,我也不知道 MySQL 上的问题。我给出的链接很好地解决了这个问题。

请注意,优化器使用的统计信息不会与数据更改同步 - 您可能也需要偶尔运行UPDATE STATISTICS

于 2010-07-29T17:21:51.890 回答
0

当您更改 ddl 时,存储过程执行计划将从缓存中删除,但正如 OMG Ponies 所说,优化器不会跟踪数据更改。

解决此问题的一种方法是使用 With Recompile 选项,每次运行时都会编译该过程。另一种可能的解决方案是定期运行 sp_recompile,它将存储过程标记为重新编译。

于 2010-07-29T17:29:43.093 回答