2013-05-20 47 views
1

我有一個過程,在我們的業務中運行時間以外。該過程偶爾會在刪除語句中失敗。刪除語句通過實體框架執行(我不知道這是否重要),並且還存在級聯刪除。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

你可以給我們DELETE代碼嗎? –

+1

檢查以查看錶是否被鎖定... http://stackoverflow.com/questions/1511675/how-to-check-if-a-table-is-locked-in-sql-server –

回答

2

是的,讀取可以阻止刪除。

但是,它也可能是導致此問題的級聯刪除。

我們遇到了完全相同的問題,事實證明問題不在於我們從表(A)中刪除的表,而是有一個外鍵引用它的表(表B)。

在表B中,我們沒有在表A中作爲外鍵的字段上的索引。因此,對於從表A中刪除的每個記錄,必須順序掃描表B以尋找外鍵約束。當我們試圖一次從表A中刪除大約1000條記錄時,查詢就會超時。

一旦我們向表B中的字段添加了一個索引,表A上的DELETE就從10分鐘變爲瞬間運行。

+0

我們已經檢查我們所有的級聯刪除,我們有所有這些外鍵索引。 – AWeim

+0

@AWeim - 不只是級聯刪除 - 任何類型的外鍵約束(ON DELETE NO ACTION等)。 – mbeckish

+0

你是否說我們需要所有FK限制的索引? – AWeim