Eu tenho três tabelas CCI (Clustered Columnstore Index) no SQL Server 2016. Todas essas CCIs estão no mesmo esquema de particionamento, com base no ID do inquilino. Ultimamente e inconsistentemente, estou obtendo impasses em simples instruções de seleção de junções a essas tabelas. Consulta de exemplo que trava:
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
Mensagem de erro:
A transação (ID do Processo 56) foi bloqueada em recursos genéricos de objetos esperáveis com outro processo e foi escolhida como vítima do conflito. Execute novamente a transação.
Pistas:
- Se a consulta usar outro índice além do CCI, não haverá conflito.
- Se eu remover dois dos três filtros de inquilino, ele não entra em conflito.
- Se eu selecionar os 32 melhores ou menos, não haverá conflito.
- Se eu adicionar OPTION (MAXDOP 1), não haverá conflito.
- Posso reproduzir isso na minha réplica embaralhada do PROD, no PROD READ-ONLY Secondary e no próprio PROD.
- Não consigo reproduzir esse comportamento no DEV ou INT.
- Ele ainda trava se eu adicionar WITH (NOLOCK) a todas as 3 junções da tabela
- A consulta entra em conflito. Ele entrará em conflito quando não houver outros processos ativos.
- Os planos de consulta sem paralelismo não entram em conflito
Nossa versão PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 de janeiro de 2019 18:51:38 Copyright (c) Microsoft Corporation Enterprise Edition (64 bits) no Windows Server 2012 R2 Standard 6.3 (Build 9600 :) (Hypervisor)
Como evito impasses nessa consulta?