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