1

我们有一个过程可以看到一些一致的查询内并行性 desdlocks 涉及以下 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. 还是在SELECT子查询中的语句末尾?

请帮忙!

4

1 回答 1

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

于 2013-09-18T23:56:20.940 回答