2008-12-18 42 views
4

您的基本SP用默认参数来完成:已知问题?:SQL Server 2005的存储过程失败,出现一个参数

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选项,以避免参数嗅探(这是从来没有必要在发展,其中这件事情的罚款)

的作品完成了一个罚款一两分钟,另一方永远不会完成 - 只要坐在那里几个小时。

这个问题从来没有发生过的开发服务器(构建9.00.3282.00)上,生产服务器是建立9.00.3068.00

我已经去除了各种代码从特效,试图坐下来最小版本仍然存在问题,并且一直非常小心地保持SP的两个版本除了那一个参数以外都是相同的。

我有很多其他SPs采取参数,他们确实运行良好。我还有DROP ped和re CREATE编辑SP。

任何想法?

是的,我有一个DBA看着它,我没有SHOWPLAN或生产的任何有用的权利,看看是否有阻塞(如果一个人的计划导致锁升级我猜 - 再次,唯一的区别是参数)

我已经审查了所有的SQL Server构建信息,并没有看到有关这个的已知问题,所以直到我弄明白或者DBA将其计算出来时,我有点卡住了。

UPDATE

这也未能完成(这实际上是对这些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 

然而这一个完成(其可能工作作为一种解决方法,虽然我对这些SP的25修改其全部具有相同的形式):

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 
+0

不要紧,默认值是什么?你可以去掉代码并逐个添加它以查看它何时锁定? – n8wrl 2008-12-18 19:59:08

回答

2

尝试屏蔽输入参数。

我猜重编译不工作,因为指定的默认值(编辑:或在第一次调用发送的参数)在编译时被嗅探。所以,重新编译没有效果。

我已经看到估计计划之间的巨大差异,只需将默认值从说,零到NULL,或没有一个。

ALTER PROCEDURE [usp_debug_mightwork] 
    @DATA_DT_ID AS int = 20081130 
AS 
BEGIN 
    DECLARE @IDATA_DT_ID AS int 
    SET @IDATA_DT_ID = @DATA_DT_ID 
    -- Stuff here that depends on IDATA_DT_ID 
END 

我认为this article解释...

...参数值时 编译或重新编译闻...

编辑:

New link on query plans and parameters。它仍然是参数嗅探是否指定了默认值。

上 的GetRecentSales存储过程 指定WITH RECOMPILE选项上面并没有消除 基数估计误差

Kind of related article about constants and plans

+0

参数遮罩似乎正常。但是,默认情况似乎不是主要原因 - 我已经用迄今已知的内容更新了我的问题。 – 2008-12-18 20:32:36

+0

添加更多链接 – gbn 2008-12-19 04:58:52

0

防止嗅探参数,或者你是敬酒时统计变化。我有500+ SPS和所有的人都开始:

DECLARE @_Param1 ..., @_ParamN

--- prevent pameter sniffing
SELECT @_Param1 = @Param1, @_ParamN = @ParamN