【发布时间】:2010-09-29 16:25:21
【问题描述】:
我知道这与参数嗅探有关,但我只是对以下示例之类的事情感到困惑,即使是一项可以很好地完成许多复杂事情的技术。
我们中的许多人都遇到过存储过程,它间歇性地运行比平时慢几个数量级,然后如果你从过程中复制出 sql 并在单独的查询窗口中使用相同的参数值,它的运行速度也一样快像往常一样。
我只是通过转换这个来修复这样的过程:
alter procedure p_MyProc
(
@param1 int
) as -- do a complex query with @param1
到这里:
alter procedure p_MyProc
(
@param1 int
)
as
declare @param1Copy int;
set @param1Copy = @param1;
-- Do the query using @param1Copy
它从一分钟多的运行时间缩短到一秒钟以内,就像它通常运行的那样。这种行为似乎完全随机。对于 10 个 @param1 输入中的 9 个,查询速度很快,无论最终需要处理多少数据,或者结果集有多大。但是对于十分之一的人来说,它只是迷路了。解决方法是在查询中用相同的 int 替换一个 int?
没有意义。
[编辑]
@gbn 链接到这个问题,其中详述了一个类似的问题:
Known issue?: SQL Server 2005 stored procedure fails to complete with a parameter
我不敢喊“虫子!”因为这通常是一种逃避,但这对我来说确实是一个错误。当我使用相同的输入运行存储过程的两个版本时,我看到了相同的查询计划。唯一的区别是原版运行需要一分钟多,而带有傻瓜参数复制的版本会立即运行。
【问题讨论】:
-
是否总是相同的值导致它变慢?数据库中是否同时发生了其他事情?您正在运行什么版本的 sql server(最新的服务包?)
-
Sql Server 2005, 9.00.3073.00。在这种情况下,参数是列表表的 PK,查询分析不同表中列表中的项目。无论数据库上的活动如何,我都可以使用大约十分之一的列表 ID 来重现它。运行两个版本时的查询计划是相同的。
-
在这些情况下执行是否不同?我知道计划是一样的,但是 sql profiler 说 proc 中每个语句的持续时间、读写计数是什么?
-
正确 - 设置统计 IO 和设置统计时间。如果统计数据相同,您就知道它被重创了。
-
它没有调用任何子 SP 是吗?这些肯定是有问题的。
标签: sql sql-server optimization