【问题标题】:Timeout with INSTEAD OF DELETE triggerINSTEAD OF DELETE 触发器超时
【发布时间】:2011-08-31 00:07:11
【问题描述】:

我在 SQL Server 2008 R2 下遇到了以下超时问题,而不是删除触发器。只有在同一事务中删除许多(> 6 个左右)CustomFieldOptions 时才会出现这种情况。

CREATE TRIGGER dbo.[DeleteCustomFieldOptionInsteadOfTrigger] ON dbo.[CustomFieldOption] INSTEAD OF DELETE
AS

BEGIN

    SET NOCOUNT ON;

    UPDATE ucf  SET ucf.PendingCustomFieldOptionIdValue = NULL, ucf.PendingProposedStateId = NULL
                FROM UserCustomField ucf
    INNER JOIN deleted d ON d.CustomFieldOptionId = ucf.PendingCustomFieldOptionIdValue
    WHERE ucf.CurrentCustomFieldOptionIdValue IS NOT NULL;

    SET NOCOUNT ON;

    DELETE ucf FROM UserCustomField ucf
                INNER JOIN deleted d ON d.CustomFieldOptionId = ucf.PendingCustomFieldOptionIdValue
    WHERE ucf.CurrentCustomFieldOptionIdValue IS NULL;

    SET NOCOUNT ON;

    DELETE ucf FROM UserCustomField ucf
                INNER JOIN deleted d ON d.CustomFieldOptionId = ucf.CurrentCustomFieldOptionIdValue;

    SET NOCOUNT ON;


    DELETE cfo FROM CustomFieldOption cfo
    INNER JOIN deleted d ON d.CustomFieldOptionId = cfo.CustomFieldOptionId;

    SET NOCOUNT OFF;

END

我意识到可能需要进一步的上下文(我会根据需要更新问题)——我在这里做的事情明显错了吗?

【问题讨论】:

  • 为“死锁”和“死锁图”运行分析器跟踪
  • @Mitch Wheat:你能说得更具体一点吗,请回复:我需要做的追踪?
  • 您的表是否为您正在执行的deleted 上的联接提供适当的索引?这些语句的执行计划是什么样的?
  • @Martin Smith:你能提供一些关于在这种情况下你认为合适索引的细节吗?
  • @Martin Smith:感谢您的提示;在我的 UserCustomField 表中为外键添加索引解决了这个问题 - 如果您将评论添加为答案,我将接受它作为解决方案。

标签: sql-server sql-server-2008 triggers


【解决方案1】:

我将首先确定您是否遇到死锁:How to Track Down Deadlocks Using SQL Server 2005 Profiler(也适用于 SQL Server 2008 R2)

[顺便说一句:每个存储过程只需要一个SET NOCOUNT ON; 实例]

其次,(根据@Martin 的评论)您在这些表上有哪些索引?正确的(覆盖)索引可以对整体性能和阻塞产生巨大的影响。

【讨论】:

  • 感谢您的信息;看来要弄清这个问题的根源可能需要相当多的工作。
【解决方案2】:

您的表是否有适合您正在执行的已删除连接的索引?这些语句的执行计划是什么样的?

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2014-11-11
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多