Mam trzy tabele Clustered Columnstore Index (CCI) w SQL Server 2016. Wszystkie te CCI są w tym samym schemacie partycjonowania, w oparciu o identyfikator dzierżawcy. Ostatnio i niekonsekwentnie dostaję się do impasu prostych instrukcji select od złączeń do tych tabel. Przykładowe zapytanie zakleszczone:
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
Komunikat o błędzie:
Transakcja (ID procesu 56) została zakleszczona na ogólnych zasobach obiektów oczekujących na inny proces i została wybrana jako ofiara zakleszczenia. Uruchom ponownie transakcję.
Wskazówki:
- Jeśli zapytanie używa innego indeksu oprócz CCI, nie jest zakleszczone.
- Jeśli usunę dwa z trzech filtrów dzierżawcy, nie spowoduje to impasu.
- Jeśli wybiorę top 32 lub niższą, nie zostanie zakleszczony.
- Jeśli dodam OPCJĘ (MAXDOP 1), nie spowoduje to zakleszczenia.
- Mogę repro to w mojej zaszyfrowanej replice PROD, PROD READ-TYLKO wtórne i PROD samej.
- Nie mogę zarzucić tego zachowania w DEV lub INT.
- Nadal blokuje się, jeśli dodam Z (NOLOCK) do wszystkich 3 połączeń stolików
- Zapytanie samo się blokuje. Zakleszczy się, gdy nie będzie żadnych innych aktywnych procesów.
- Plany zapytań bez równoległości nie blokują się
Nasza wersja PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 stycznia 2019 18:51:38 Prawa autorskie (c) Microsoft Corporation Enterprise Edition (64-bit) w systemie Windows Server 2012 R2 Standard 6.3 (kompilacja 9600 :) (Hypervisor)
Jak zapobiec zakleszczeniom tego zapytania?
źródło