J'ai trois tables CCI (Clustered Columnstore Index) dans SQL Server 2016. Toutes ces CCI sont dans le même schéma de partitionnement, basé sur l'ID du locataire. Dernièrement, et de manière incohérente, je reçois des blocages sur les instructions de sélection simples des jointures à ces tables. Exemple de requête bloquant:
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
Message d'erreur:
La transaction (ID de processus 56) a été bloquée sur des ressources d'objet en attente génériques avec un autre processus et a été choisie comme victime de blocage. Relancez la transaction.
Des indices:
- Si la requête utilise un autre index en plus de la CCI, elle ne se bloque pas.
- Si je supprime deux des trois filtres tenantid, cela n'entraîne pas d'interblocage.
- Si je sélectionne les 32 premiers ou inférieurs, cela n'entraîne pas de blocage.
- Si j'ajoute OPTION (MAXDOP 1), cela ne bloque pas.
- Je peux le reprocher dans ma réplique PROD brouillée, PROD READ-ONLY Secondary et PROD lui-même.
- Je ne peux pas reprocher ce comportement dans DEV ou INT.
- Il se bloque toujours si j'ajoute WITH (NOLOCK) aux 3 jointures de table
- La requête se bloque d'elle-même. Il se bloquera lorsqu'il n'y a aucun autre processus actif.
- Les plans de requête sans parallélisme ne bloquent pas
Notre version PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 janvier 2019 18:51:38 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) sur Windows Server 2012 R2 Standard 6.3 (Build 9600 :) (Hyperviseur)
Comment empêcher les blocages sur cette requête?