Ho tre tabelle CCI (Clustered Columnstore Index) in SQL Server 2016. Tutti questi CCI si trovano nello stesso schema di partizionamento, basato sull'ID tenant. Ultimamente e incoerentemente, sto ottenendo deadlock su semplici istruzioni select dai join a queste tabelle. Query di esempio che blocca i deadlock:
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
Messaggio di errore:
La transazione (ID processo 56) è stata bloccata su risorse generiche di oggetti attendibili con un altro processo ed è stata scelta come vittima del deadlock. Rieseguire la transazione.
indizi:
- Se la query utilizza un altro indice oltre a CCI, non si blocca.
- Se rimuovo due dei tre filtri tenantid, non si blocca.
- Se seleziono la parte superiore 32 o inferiore, non si blocca.
- Se aggiungo OPTION (MAXDOP 1) non si blocca.
- Posso riproporlo nella mia replica PROD criptata, nella PROD READ-ONLY Secondary e nella stessa PROD.
- Non riesco a riprodurre questo comportamento in DEV o INT.
- Si blocca ancora se aggiungo WITH (NOLOCK) a tutti e 3 i join di tabella
- La query si blocca da sola. Si bloccherà quando non ci sono altri processi attivi.
- I piani di query senza parallelismo non si bloccano
La nostra versione PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 gennaio 2019 18:51:38 Copyright (c) Microsoft Corporation Enterprise Edition (64 bit) su Windows Server 2012 R2 Standard 6.3 (Build 9600 :) (Hypervisor)
Come posso evitare deadlock su questa query?