Tengo tres tablas de índice de almacén de columnas en clúster (CCI) en SQL Server 2016. Todas estas CCI están en el mismo esquema de partición, basado en la identificación del inquilino. Últimamente, e inconsistentemente, estoy llegando a puntos muertos en declaraciones simples de selección de uniones a estas tablas. Ejemplo de consulta que interbloquea:
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
Mensaje de error:
La transacción (ID de proceso 56) se bloqueó en recursos genéricos de objetos esperables con otro proceso y se ha elegido como víctima de bloqueo. Vuelva a ejecutar la transacción.
Pistas:
- Si la consulta usa otro índice además del CCI, no tiene punto muerto.
- Si elimino dos de los tres filtros de tenantid, no se bloquea.
- Si SELECCIONO el top 32 o inferior, no se bloquea.
- Si agrego OPCIÓN (MAXDOP 1) no se bloquea.
- Puedo reprobar esto en mi réplica PROD revuelta, PROD READ-ONLY Secondary y PROD en sí.
- No puedo reprochar este comportamiento en DEV o INT.
- Todavía se interrumpe si agrego WITH (NOLOCK) a las 3 combinaciones de tabla
- La consulta se interrumpe. Se bloqueará cuando no haya otros procesos activos.
- Los planes de consulta sin paralelismo no se estancan
Nuestra versión PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 de enero de 2019 18:51:38 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) en Windows Server 2012 R2 Standard 6.3 (Build 9600 :) (Hipervisor)
¿Cómo evito puntos muertos en esta consulta?
fuente