SQL Server删除语句计时

时间:2013-05-20 15:34:01

标签: sql-server

我的营业时间在我们的营业时间内运行。该过程偶尔会在删除语句上失败。删除语句是通过实体框架执行的(我不知道这是否重要)并且还会发生级联删除。

我们得到的错误如下:超时已到期。

  

操作完成前经过的超时时间   或服务器没有响应。声明已经终止。

我正在试图找出导致这种情况的原因。我发现我们有另一个进程在同一时间运行,它从正在发生删除的相同文件的视图中选择数据。可以读一下这个视图“阻止”删除吗?

 public void DeletePolicySegments(IList<int> segmentIds)
    {
        using (Models.PolicyContainer context = new Models.PolicyContainer())
        {
            if (segmentIds != null && segmentIds.Count > 0)
            {
                foreach (var segmentId in segmentIds)
                {
                    var x = context.PolicySegments.Where(t => t.SegmentId == segmentId).Single();
                    context.PolicySegments.DeleteObject(x);
                }
                context.SaveChanges();
            }
        }
    }

每次调用“DeletePolicySegments”时,只应删除2-4个“段”。

1 个答案:

答案 0 :(得分:2)

是的,读取可以阻止删除。

但是,它也可能是引起此问题的级联删除。

我们遇到了完全相同的问题,事实证明问题不在于我们从表中删除的表(表A),而是具有外键引用的表(表B)。

在表B中,我们没有关于作为表A的外键的字段的索引。因此,对于从表A中删除的每个记录,必须顺序扫描表B以查找外键约束。当我们尝试一次删除表A中的大约1000条记录时,查询会超时。

一旦我们在表B中的字段中添加了索引,表A上的DELETE就会从10分钟变为即时运行。