SQL作为SP执行时挂起但是可以作为SQL

时间:2011-04-05 23:54:48

标签: sql-server sql-server-2005 sql-server-2008

问候, 我一直在分析删除存储过程的问题。该过程只是执行级联删除某个实体。

当我在查询编辑器中将SP分解为SQL时,它运行大约。但是,当通过EXEC SP执行SP时,需要7秒钟才能执行。

我试过以下但没有运气:

  • 删除SP,然后使用WITH RECOMPILE
  • 重新创建它
  • 已添加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

  • SQL在编辑器中运行时有许多并发连接没有问题。

  • EXEC过程挂起,有或没有并发连接

程序类似于:

 ALTER PROCEDURE [dbo].[DELETE_Something]
    (
        @SomethingID INT,
        @Result INT OUT,
        @ResultMessage NVARCHAR(1000) OUT
    )--WITH RECOMPILE--!!!DEBUGGING
    AS

    --SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED--!!!DEBUGGING

    SET @Result=1
    BEGIN TRANSACTION
    BEGIN TRY

        DELETE FROM XXXXX --APPROX. 34 Records
        DELETE FROM XXXX  --APPROX. 227 Records         
        DELETE FROM XXX   --APPROX. 58 Records  
        DELETE FROM XX    --APPROX. 24 Records      
        DELETE FROM X     --APPROX. 14 Records  

        DELETE FROM A -- 1 Record
        DELETE FROM B -- 1 Record
        DELETE FROM C -- 1 Record

        DELETE FROM D --APROX. 3400 Records !!!HANGS FOR OVER ONE MINUTE TRACING THROUGH SP BUT NOT SQL

        GOTO COMMIT_TRANS   

    END TRY
    BEGIN CATCH 
        GOTO ROLLBACK_TRANS
    END CATCH       

    COMMIT_TRANS:
        SET @Result=1   
        COMMIT TRANSACTION
        RETURN  

    ROLLBACK_TRANS: 
        SET @Result=0
        SET @ResultMessage=CAST(ERROR_MESSAGE() AS NVARCHAR(1000))
        ROLLBACK TRANSACTION
        RETURN

3 个答案:

答案 0 :(得分:2)

确保您的统计信息是最新的。假设DELETE语句对传递的参数有一些参考,如果您使用的是SQL 2008,则可以尝试使用OPTIMIZE FOR UNKNOWN 选项。

答案 1 :(得分:1)

这更像是一个参数嗅探(或欺骗)问题。这是一个很少使用的SP。使用OPTION(OPTIMIZE FOR UNKNOWN)对于使用相对较大的表的参数的语句显然解决了问题。感谢SqlACID提示。

DELETE FROM 
   ProblemTableWithManyIndexes
WHERE                                   
   TableID=@TableID 
OPTION (OPTIMIZE FOR UNKNOWN)

答案 2 :(得分:1)

与任何性能问题一样,您需要衡量为什么它'挂起'。猜测会让你无处可去。使用方法论方法,如Waits and Queues。最简单的方法是查看sys.dm_exec_requests中的wait_typewait_timewait_resource,查看执行sp的请求,同时执行sp。根据实际导致堵塞的原因,您可以采取适当的措施。