Ошибки "Intra-query parallelism" и "Deadlock on thread communication buffer"

Краткое содержание:

Рекомендации по ошибкам СУБД:

Применимость:

Проблема

При работе на многопроцессорном компьютере Microsoft SQL Server может попытаться распараллелить процесс выполнения запроса на несколько процессоров. Обычно это происходит в том случае, если план запроса неоптимален. При параллельном выполнении нескольких частей одного запроса на разных процессорах, возможна ситуация, при которой разные потоки выполнения взаимно заблокируют друг друга (deadlock) и дальнейшее выполнение запроса будет невозможным. В этом случае MS SQL Server выдает ошибку "Intra-query parallelism caused your server command (process ID #XX) to deadlock. Rerun the query without intra-query parallelism by using the query hint option (maxdop 1)". 

Решение

Для ограничения количества процессоров в плане параллельного выполнения может быть использован параметр max degree of parallelism. Установленное по умолчанию значение 0 использует все доступные процессоры. Значение выше 1 (до 64) позволяет ограничить максимальное количество процессоров, используемых при выполнении одного запроса. Если указано значение, превышающее число доступных процессоров, используется фактическое число доступных процессоров. Если у компьютера только один процессор, то значение параметра max degree of parallelism учитываться не будет.

Для решения описанных выше проблем необходимо установить значение параметра max degree of parallelism равным 1. Следует учитывать, что эта установка ограничивает количество процессоров, которые использует SQL Server при выполнении отдельного запроса, и как правило, это не оказывает существеного влияния на время выполнения большинства используемых запросов.

Однако это не ограничивает количество доступных SQL Server процессоров в целом, т.е. два запроса от разных клиентских приложений будут выполняться параллельно.

Другим способом решения проблемы является оптимизация исполняемого запроса.