SQL Server内部查询并行性死锁

时间:2013-07-18 13:54:19

标签: tsql sql-server-2008-r2 database-deadlocks

我们有一个流程可以看到一些一致的查询内并行性解决方案,涉及以下AD-HOC。我找到了几个可用的工作:

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,但我对可以在更新语句中添加的位置感到困惑:

  1. 是否在Update声明
  2. 的末尾
  3. 或子查询中SELECT语句的结尾?
  4. 请帮助!

1 个答案:

答案 0 :(得分: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