【发布时间】:2008-12-18 19:51:20
【问题描述】:
带有默认参数的基本 SP:
ALTER PROCEDURE [usp_debug_fails]
@DATA_DT_ID AS int = 20081130
WITH RECOMPILE
AS
BEGIN
/*
Usage:
EXEC [usp_debug_fails] WITH RECOMPILE
*/
-- Stuff here that depends on DATA_DT_ID
END
具有硬编码本地的相同 SP。
ALTER PROCEDURE usp_debug_works]
WITH RECOMPILE
AS
BEGIN
/*
Usage:
EXEC [usp_debug_works] WITH RECOMPILE
*/
DECLARE @DATA_DT_ID AS int
SET @DATA_DT_ID = 20081130
-- Stuff here that depends on DATA_DT_ID
END
你可以看到我把(冗余,甚至)WITH RECOMPILE 选项放在哪里,以避免参数嗅探(这在开发中从来没有必要,因为这个东西运行良好)
一个可以在一两分钟内完成的工作,另一个永远不会完成 - 只是坐在那里几个小时。
开发服务器(build 9.00.3282.00)从来没有出现过这个问题,生产服务器是build 9.00.3068.00
我已经从 procs 中删除了各种代码,以尝试降低到仍然存在问题的最小版本,并且非常小心地保持 SP 的两个版本除了那个参数之外相同。
我有很多其他带有参数的 SP,它们运行良好。我还 DROPped 和 reCREATEed SP。
有什么想法吗?
是的,我有一个 DBA 正在查看它,但我没有 SHOWPLAN 或任何有用的生产权限来查看是否存在阻塞(如果一个人的计划导致锁升级,我猜 - 同样,唯一的区别是参数)
我已经查看了所有 SQL Server 构建信息,但没有发现与此相关的已知问题,所以在我弄清楚或 DBA 弄清楚之前,我有点卡住了。
更新
这也无法完成(这实际上是这些SP的正常形式-我只是放了一个默认值,以便在测试期间更容易来回切换)
ALTER PROCEDURE [usp_debug_fails]
@DATA_DT_ID AS int
WITH RECOMPILE
AS
BEGIN
/*
Usage:
EXEC [usp_debug_fails] 20081130 WITH RECOMPILE
*/
-- Stuff here that depends on DATA_DT_ID
END
但是这个完成(这可能是一种解决方法,尽管我有大约 25 个这些 SP 需要修改,它们都具有相同的形式):
ALTER PROCEDURE [usp_debug_fails]
@DATA_DT_ID_in AS int
WITH RECOMPILE
AS
BEGIN
/*
Usage:
EXEC [usp_debug_fails] 20081130 WITH RECOMPILE
*/
DECLARE @DATA_DT_ID AS int
SET @DATA_DT_ID = @DATA_DT_ID_in
-- Stuff here that depends on DATA_DT_ID
END
【问题讨论】:
-
默认值是多少有关系吗?你能把代码去掉,然后一点一点地加回来,看看它什么时候被锁住了吗?
标签: sql sql-server sql-server-2005 stored-procedures