问候, 我一直在分析删除存储过程的问题。该过程只是执行级联删除某个实体。
当我在查询编辑器中将SP分解为SQL时,它运行大约。但是,当通过EXEC SP执行SP时,需要7秒钟才能执行。
我试过以下但没有运气:
已添加SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SQL在编辑器中运行时有许多并发连接没有问题。
程序类似于:
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
答案 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_type
,wait_time
和wait_resource
,查看执行sp的请求,同时执行sp。根据实际导致堵塞的原因,您可以采取适当的措施。