2017-10-09 2 views
0

우리 데이터베이스에 큰 문제가 있습니다. 우리는 2008 호환성을 갖춘 SQL Server 2014를 사용하고 있습니다.데이터베이스 잠금 문제

매일 아침 우리는 데이터베이스 잠금 문제를 겪고 있으며 데이터베이스는 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

재 컴파일은 도움이됩니다. OPTION (RECOMPILE) 또는 OPTION (OPTIMIZE)을 추가하십시오. 또는 쿼리 행을 가져옵니다.

+0

정말로 감사합니다. 재미 있네. 나는 내일 다시 너에게 갈거야. 쿼리에서 볼 수 있듯이 If else 문이 있습니다. 우리는 이것들에 대해 다른 저장 프로 시저가 있어야한다고 생각합니까? – DevelopmentIsMyPassion

+0

는 OPTION (OPTIMIZE)처럼 보입니다. 더 많은 것을 확인하기 위해 2 일간 더 기다릴 것입니다. – DevelopmentIsMyPassion

0

Read Committed Snapshot Isolation Level을 사용하는 경우 독자가 작성자를 차단하지 않고 작성자가 독자를 차단하지 않는다는 의미입니다. 따라서이 경우 nolock 힌트는 쓸모가 없으며 제거하도록 제안합니다.

기본 문제는 다른 것이지만 잠그고 있다고 생각합니다. 아마도이 저장 프로 시저가 느리게 실행되고 많은 서버 리소스를 사용합니다.