2017-10-09 130 views
0

我們的數據庫存在嚴重問題。我們使用SQL Server 2014與2008兼容。數據庫鎖定問題

每天早上,我們正在獲取數據庫鎖定問題和數據庫使用100%cpu。 因此,我們每天早上修復此問題的方法是修改以下存儲過程,並在添加和刪除語句中的NoLock和再次運行過程之間切換,並且數據庫很高興。所以我們不知道爲什麼我們有時需要添加NoLock,有時不需要添加。

ALTER Procedure [dbo].[ScanBox] 
(
@KollieID varchar(50) = '', 
@SupplierID int = 0, 
@BuyerID int = 0 
) 
As 
Set NoCount On 

IF @kollieid <> '' AND @supplierid >0 
BEGIN 

    SELECT TRPO_KollieID.ID, OrderID, ISNULL(BoxNo, - 1) AS BoxNo, ISNULL(KollieID, '') AS KollieID, KollieNumber, 
      ISNULL(LastStatus, - 1) AS LastStatus, LastStatusTime, ISNULL(LastStatusPDA, - 1) AS LastStatusPDA, 
      ISNULL(LastStatusTDLogin, '') AS LastStatusTDLogin, ISNULL(OrginalKollieID,'') AS OrginalKollieID, 
      ISNULL(OS.StatusName, '') AS LastStatusText , ISNULL(OrderStatusExternalText,'') AS OrderStatusExternalText , 
      ISNULL(Terminal, '') AS Terminal, ISNULL(TerminalZone,'') AS TerminalZone 
    FROM TRPO_KollieID 
    WITH (NOLOCK) 
      LEFT OUTER JOIN OrderStatus os WITH (NOLOCK) on OS.StatusID = TRPO_KollieID.LastStatus  
    WHERE TRPO_KollieID.KollieID = @KollieID AND (OrderID IN (SELECT TRPO_Header.ID 
         FROM TRPO_Header WITH (NOLOCK) 
          INNER JOIN TRPO_KollieID WITH (NOLOCK) ON TRPO_KollieID.OrderID = TRPO_Header.ID 
         WHERE TRPO_Header.SupplierID = @supplierid AND TRPO_Header.Status <> 'A' AND TRPO_KollieID.KollieID = @kollieid)) 
END 
ELSE IF @kollieid <> '' AND @BuyerID >0 
BEGIN 

    SELECT TRPO_KollieID.ID, OrderID, ISNULL(BoxNo, - 1) AS BoxNo, ISNULL(KollieID, '') AS KollieID, KollieNumber, 
      ISNULL(LastStatus, - 1) AS LastStatus, LastStatusTime, ISNULL(LastStatusPDA, - 1) AS LastStatusPDA, 
      ISNULL(LastStatusTDLogin, '') AS LastStatusTDLogin, ISNULL(OrginalKollieID,'') AS OrginalKollieID, 
      ISNULL(OS.StatusName, '') AS LastStatusText , ISNULL(OrderStatusExternalText,'') AS OrderStatusExternalText , 
      ISNULL(Terminal, '') AS Terminal, ISNULL(TerminalZone,'') AS TerminalZone 
    FROM TRPO_KollieID 
    WITH (NOLOCK) 
      LEFT OUTER JOIN OrderStatus os WITH (NOLOCK) on OS.StatusID = TRPO_KollieID.LastStatus 
    WHERE TRPO_KollieID.KollieID = @KollieID AND OrderID IN (SELECT TRPO_Header.ID 
         FROM TRPO_Header WITH (NOLOCK) 
          INNER JOIN TRPO_KollieID WITH (NOLOCK) ON TRPO_KollieID.OrderID = TRPO_Header.ID 
         WHERE TRPO_Header.BuyerID = @BuyerID AND TRPO_Header.Status <> 'A' AND TRPO_KollieID.KollieID = @kollieid)  



END 

我們已經嘗試是

  1. 我們試圖索引數據庫。
  2. 試圖設置的IsolationLevel讀提交快照

沒有幫助我們。有沒有人有解決這個問題的好主意?

+0

給我們這個查詢的執行計劃。也許你沒有以正確的方式編制數據庫索引。另外 - 不要使用NOLOCK提示。 –

回答

1

重新編譯可以幫助你,而不是nolock。嘗試添加OPTION(RECOMPILE)或OPTION(OPTIMIZE)...或者獲得查詢paln

+0

非常感謝。看起來很有趣。我明天會就此回覆你。正如你在我們的查詢中看到的那樣,我們有If else語句。你認爲我們應該有不同的存儲過程嗎? – DevelopmentIsMyPassion

+0

看起來像OPTION(OPTIMIZE)已經工作。再等兩天再檢查一下 – DevelopmentIsMyPassion

0

如果您使用的是Read Committed Snapshot Isolation Level,這意味着讀者不會阻止編寫者,編寫者也不會阻止讀者。所以在這種情況下nolock提示是無用的,我會建議你刪除它們。

我認爲基本問題是在另一件事情,但鎖定,也許這存儲過程執行緩慢,並使用許多服務器資源。