Ich habe drei CCI-Tabellen (Clustered Columnstore Index) in SQL Server 2016. Alle diese CCIs befinden sich im selben Partitionierungsschema, basierend auf der Mandanten-ID. In letzter Zeit und uneinheitlich erhalte ich Deadlocks bei einfachen select-Anweisungen von Verknüpfungen zu diesen Tabellen. Beispielabfrage, die blockiert:
SELECT TOP 33 r.tenantid
FROM Table_r r
INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey
INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey
WHERE r.TenantId = 69
AND pe.TenantId = 69
AND cm.TenantId = 69
Fehlermeldung:
Die Transaktion (Prozess-ID 56) wurde für generische wartbare Objektressourcen mit einem anderen Prozess blockiert und als Deadlock-Opfer ausgewählt. Führen Sie die Transaktion erneut aus.
Hinweise:
- Wenn die Abfrage neben der CCI einen anderen Index verwendet, blockiert sie nicht.
- Wenn ich zwei der drei Tenantid-Filter entferne, blockiert dies nicht.
- Wenn ich Top 32 oder niedriger auswähle, blockiert es nicht.
- Wenn ich OPTION (MAXDOP 1) hinzufüge, blockiert es nicht.
- Ich kann dies in meinem verschlüsselten PROD-Replikat, PROD READ-ONLY Secondary und PROD selbst wiedergeben.
- Ich kann dieses Verhalten in DEV oder INT nicht wiederholen.
- Es blockiert immer noch, wenn ich WITH (NOLOCK) zu allen 3 Tabellenverknüpfungen hinzufüge
- Die Abfrage blockiert sich selbst. Es wird blockiert, wenn keine anderen aktiven Prozesse vorhanden sind.
- Abfragepläne ohne Parallelität blockieren nicht
Unsere PROD-Version:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10. Januar 2019 18:51:38 Copyright (c) Microsoft Corporation Enterprise Edition (64-Bit) unter Windows Server 2012 R2 Standard 6.3 (Build 9600) :) (Hypervisor)
Wie verhindere ich Deadlocks bei dieser Abfrage?