Назад | Перейти на главную страницу

Сервер MS Sql перегружается приостановленными запросами, в основном читает. Как это исправить?

У меня есть Microsoft Sql Server, который обрабатывает умеренный объем трафика для пакета программного обеспечения компании, состоящего из нескольких клиентов на java и C #.

Он перегружен "приостановленными" запросами. В конечном итоге они проходят, но у некоторых истекает время ожидания (особенно записи). Запросы в основном читаются.

Есть ли способ ускорить это или исправить другим способом?

Вот это картинка монитора активности, чтобы показать, о чем я говорю:

Боковое примечание: мы планируем перейти на MySql в течение некоторого времени. Это вообще поможет? Я знаю, что MS Sql силен, но с его значением по умолчанию Read-Committed, может ли это повредить чему-нибудь?

Типы ожидания, показанные на скриншоте:

  • LCK_M_X - возникает, когда задача ожидает получения монопольной блокировки.
  • CXPACKET - возникает с планами параллельных запросов при попытке синхронизировать итератор обмена обработчика запросов. Если ожидание является чрезмерным и не может быть уменьшено путем настройки запроса (например, добавления индексов), рассмотрите возможность корректировки порогового значения затрат для параллелизма или снижения степени параллелизма.

(Оба они были C & Ped из MSDN.)

MSDN предлагает настроить ваши запросы и / или добавить индексы выше. Вероятно, это лучший первый шаг, чем просто отказаться от SQL Server и переключиться на что-то еще. (Если проблема в ваших запросах, ну, они все равно будут неэффективными на MySql, IMHO.) Итак, я рекомендую посмотреть Ресурсы по статистике ожидания Брента Озара и ищу такие вещи, как десятка самых дорогих запросов. Надеюсь, это укажет вам правильное направление.

Хорошо, разобрался в проблеме.

По умолчанию MS Sql использует все ядра сервера для выполнения больших запросов. У нас есть большие чтения, поэтому складывалась длинная строка запросов, ожидающих обработки.

Чтобы исправить это, я установил максимальную степень параллелизма на 2 ядра вместо неограниченного (8 на нашем сервере), и я установил порог стоимости параллелизма на 10 (секунд) с 5, что является временем, когда параллелизм начнет работать. в для запросов.

И то, и другое можно найти в Sql Server Management Studio, щелкнув сервер правой кнопкой мыши и выбрав "Свойства", а затем щелкнув вкладку "Дополнительно".

Я нашел эту статью, в которой объясняется и решается проблема:

http://www.brentozar.com/archive/2013/08/what-is-the-cxpacket-wait-type-and-how-do-you-reduce-it/