В ходе разбора ситуации с
Александр .
Попробовали через CTE явно указать сортировку данных в стейдже:
WITH source as
(
SELECT top (cast(0x7fffffffffffffff as bigint))
***
FROM ***
ORDER BY ***
)
MERGE
****
План запроса изменился, но блокировка осталась.
В этот момент
Александр , обратил внимание, что блокировка связана с " intra-query parallelism deadlock", и известное решение в данном случае добавить к запросу option (maxdop 1).
Таким образом из плана выполнения запроса ушел параллелизм. Производительность MERGE не изменилась. При многократном тестировании ошибок не появилось. Так же планировщик уже без CTE стал предварительно сортировать данные в стейдже под индекс в целевой таблице, и NESTED LOOPS изменился на MERGE JOIN.
Большое спасибо
Александр !
@trootnev ,
@LuckyDima - благодарю, что откликнулись.
p.s.
@trootnev - подобное решение подойдёт только в ряде ситуаций, когда данные проще перезалить за период и выполнить свич партишен. Не всегда данные можно качественно поделить на секции. Я же стремлюсь получить общий(унифицируемый) подход для всех потоков данных.
@LuckyDima - если бы на проекте активно использовалась очередь, то да, можно было бы как общий стандарт разработки завернуть в эту сторону. Такого нет. И я в таком подходе вижу только дополнительную "точку отказа".