Параметр 'max degree of parallelism' опеределяет максимальное количество потоков, на которые SQL Server может распараллелить запрос. По умолчанию этот параметр равен нулю, что означает использование числа процессоров сервера. Например, если у вас 24 ядра – фактическое значение 'max degree of parallelism' будет равно 24 и оптимизатор, если он посчитает нужным, может распараллелить запрос на 24 потока. В общем случае это хорошо, но не всегда. Также, далеко не всегда хорошо использование значение этого параметра по умолчанию.
Теперь давайте разберём почему это не хорошо. Приведу один пример из своей практики. Есть запрос, который по идее должен использовать определённый индекс, и вначале так и происходит. Запускается запрос который выполняет поиск по индексу и возвращает необходимые данные. Всё отлично. Затем по мере роста базы данных в таблицу добавляются новые и новые записи и в определённый момент оптимизатор понимает, что есть возможность выполнить запрос быстрее: “Зачем мне выполнять поиск по индексу, если у меня есть 24 ядра? Значит я могу в 24 потока просканировать кластерный индекс и получить необходимые мне данные быстрее!”. Для этого конкретного запроса это хорошо – он выполняется быстрее. Но плохо всем остальным, т.к. они вынуждены ждать выделения им процессорных ресурсов. И в системах с большим количеством одновременно выполняющихся запросов такое распараллеливание скорее плохо, чем хорошо. И вместо повышения производительности она только ухудшается. До недавнего времени я решал эту проблему выставлением хинта MAXDOP в неугодных мне хранимках. Но сейчас нашёл конкретную рекомендацию Майкрософт и применил её на своих серверах. Рекомендации по выбору оптимального значения 'max degree of parallelism' находятся здесь: Recommendations and Guidelines for 'max degree of parallelism' configuration option. Цитирую данную рекомендацию:
For SQL Server 2008 R2, SQL Server 2008 and SQL Server 2005 servers, use the following guideline:
a. For servers that have eight or less processors, use the following configuration where N equals the number of processors: max degree of parallelism = 0 to N.
b. For servers that use more than eight processors, use the following configuration: max degree of parallelism = 8.
c. For servers that have NUMA configured, max degree of parallelism should not exceed the number of CPUs that are assigned to each NUMA node with the max value capped to 8. This will increase the likelyhood of all parallel threads of a query to be located within a NUMA Node and avoid costly remote node data look ups.
d. For servers that have hyper-threading enabled, the max degree of parallelism value should not exceed the number of physical processors.
Отсюда следует, что для систем, в которых больше 8-и процессоров рекомендуется ставить 'max degree of parallelism' = 8. Далее следует ещё одно пояснение, в котором говорится, что 8 – общая рекомендация. И в системах, где число одновременно выполняющихся запросов невелико имеет смысл ставить большее значение, а в системах с большим количеством конкурентных запросов ноборот меньшее. И, выбирая конкретный параметр, необходимо смотреть на его влияние на систему и тестировать на конкретных запросах.
PS: Как установить 'max degree of parallelism' можно почитать здесь - Установка параметра max degree of parallelism
Ссылки по теме:
- Recommendations and Guidelines for 'max degree of parallelism' configuration option
- Параметр max degree of parallelism