直到昨天,我们一直在我们的生产sql上运行最大程度的paralellism 1(paralellism off)的SQL server 2016。这个prod sql不是报告sql或类似的东西。这个sql为网站提供了大量的操作。
我们在1个Numa节点中有16个虚拟处理器。 (只有一个,没有划分)所以,我们将prod sql maxdop从1改为16,并且paralellism的成本是50。
由于我们更改了此设置,因此我们在sql错误日志中遇到了并列故障死锁。其中一个是这样的;
2017-02-17 23:10:22.83 spid4s PAGE: 6:1:12942122 CleanCnt:2
Mode:IX Flags: 0x3
2017-02-17 23:10:22.83 spid4s Grant List 1:
2017-02-17 23:10:22.83 spid4s Owner:0x000000C8CBCF5840 Mode: IX
Flg:0x40 Ref:0 Life:02000000 SPID:169 ECID:0 XactLockInfo: 0x000000C417DD64F8
2017-02-17 23:10:22.83 spid4s SPID: 169 ECID: 0 Statement Type:
UPDATE Line #: 1
2017-02-17 23:10:22.83 spid4s Input Buf: Language Event: UPDATE op
SET op.InvoiceDate = CAST(ud.InvoiceDate AS DATETIME)
FROM TROrderProduct op
INNER JOIN AX_UpdateInvoiceDatesIds ud ON op.PKOrderProductId =
ud.OrderProductID
WHERE ud.InvoiceDate BETWEEN GETDATE()-10and GETDATE()-1
--------------------
2017-02-17 23:10:22.83 spid4s PAGE: 6:1:14092111 CleanCnt:2
Mode:X Flags: 0x3
2017-02-17 23:10:22.83 spid4s Grant List 3:
2017-02-17 23:10:22.83 spid4s Owner:0x000000CFBC765140 Mode: X
Flg:0x40 Ref:0 Life:02000000 SPID:108 ECID:0 XactLockInfo: 0x000000CF14380440
2017-02-17 23:10:22.83 spid4s SPID: 108 ECID: 0 Statement Type:
ALTER INDEX Line #: 1
2017-02-17 23:10:22.83 spid4s Input Buf: Language Event:
DECLARE @return_value int
EXEC @return_value = [dbo].[IndexOptimize]
@Databases = N'CapuaDB', @UpdateStatistics = N'ALL', @LogToTable = N'Y', @MaxDOP=1
SELECT 'Return Value' = @return_value
您认为我们不应该将此设置更改为16吗?如果是这样,这个的正确价值是什么?我非常研究这个主题并决定这样做16因为我们在同一个numa节点有16个CPU。但无论如何,我们每天都遇到这种僵局问题。
任何想法都会受到赞赏。
感谢。