У меня есть три таблицы Clustered Columnstore Index (CCI) в SQL Server 2016. Все эти CCI находятся в одной схеме разделения, основанной на идентификаторе клиента. В последнее время и непоследовательно я получаю тупиковые ситуации для простых операторов выбора из соединений с этими таблицами. Пример запроса, который блокирует:
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
Сообщение об ошибке:
Транзакция (ID процесса 56) была заблокирована на общих ресурсах ожидаемого объекта с другим процессом и была выбрана в качестве жертвы тупика. Перезапустите транзакцию.
Ключи:
- Если запрос использует другой индекс, кроме CCI, он не блокируется.
- Если я удаляю два из трех фильтров tenantid, он не блокируется.
- Если я ВЫБИРАЮ верхнюю часть 32 или ниже, она не блокируется.
- Если я добавлю OPTION (MAXDOP 1), он не заходит в тупик.
- Я могу воспроизвести это в моей зашифрованной реплике PROD, только для чтения PROD-ONLY и самой PROD.
- Я не могу воспроизвести это поведение в DEV или INT.
- Он все еще блокируется, если я добавлю WITH (NOLOCK) во все 3 объединения таблицы
- Запрос блокирует сам себя. Он блокируется, когда нет других активных процессов.
- Планы запросов без параллелизма не зашли в тупик
Наша версия PROD:
Microsoft SQL Server 2016 (SP2-CU5) (KB4475776) - 13.0.5264.1 (X64) 10 января 2019 г. 18:51:38 Авторское право (c) Выпуск Microsoft Corporation Enterprise (64-разрядный) на Windows Server 2012 R2 Standard 6.3 (сборка 9600) :) (Гипервизор)
Как я могу предотвратить взаимные блокировки в этом запросе?
источник