2013-07-18 152 views
1

我們有一個過程,可以看到一些涉及以下AD-HOC的一致的查詢內並行desdlock。我發現這對夫妻可變通的:SQL Server查詢內並行性死鎖

UPDATE VPG 
SET VPG.CountActual = COALESCE(PGI.CNT, 0) 
FROM ValidProductGroups AS VPG 
LEFT JOIN 
    (SELECT ProductGroupID, COUNT(ProductGroupID) AS 'CNT' 
    FROM ProdGroupItems WITH(NOLOCK) 
    WHERE Deleted = 0 
    GROUP BY ProductGroupID) AS PGI ON PGI.ProductGroupID = VPG.ProductGroupID 
WHERE VPG.LocationID = 5 

我添加非聚集索引子查詢中Update聲明。下一步,將MAXDOP查詢提示添加到AD-HOC,但我有點困惑的地方,我可以添加在更新語句:在Update語句結束

  1. 它是
  2. 或在子查詢中聲明SELECT結尾?

請幫忙!

回答

0

在子查詢或CTE中不允許查詢提示。你想在UPDATE語句的末尾使用查詢提示。

UPDATE VPG 
SET VPG.CountActual = COALESCE(PGI.CNT, 0) 
FROM ValidProductGroups AS VPG 
LEFT JOIN 
    (SELECT ProductGroupID, COUNT(ProductGroupID) AS 'CNT' 
    FROM ProdGroupItems WITH(NOLOCK) 
    WHERE Deleted = 0 
    GROUP BY ProductGroupID) AS PGI ON PGI.ProductGroupID = VPG.ProductGroupID 
WHERE VPG.LocationID = 5 
OPTION (MAXDOP 1) 

更多作品: 您需要多管齊下的辦法,以消除(或減少)查詢內死鎖。在進入查詢提示之前,我會建議優化您的索引策略。

我建議你創建一個比它當前依賴的IX_ProdGroupItems_ProductGroupID_ExtHierarchyID_ExtNodeID_1索引更合適的索引來支持這個查詢。

*wink* *wink* 

希望這有助於

_UB