![Проблема доступности SQL-сервера: большой запрос не позволяет подключаться другим соединениям](https://rvso.com/image/515035/%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0%20%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%BD%D0%BE%D1%81%D1%82%D0%B8%20SQL-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%3A%20%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%BD%D0%B5%20%D0%BF%D0%BE%D0%B7%D0%B2%D0%BE%D0%BB%D1%8F%D0%B5%D1%82%20%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B0%D1%82%D1%8C%D1%81%D1%8F%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%BC%20%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F%D0%BC.png)
У меня есть высокопроизводительный (многоядерный, RAID) сервер, на котором запущен MS SQL 2008, с несколькими базами данных. У меня есть процесс с низкой пропускной способностью, которому периодически требуется небольшой объем информации из одной из баз данных, и код, похоже, работает нормально.
Однако иногда, когда кто-то из моих коллег выполняет большой запрос к одной из других баз данных, я вижу полную загрузку ЦП на машине, а соединения из моего приложения прерываются по тайм-ауту.
Почему это происходит? Я бы подумал, что множество ядер и жестких дисков каким-то образом (вместе с умно написанным сервером БД) смогут сохранить хотя бы часть ресурсов свободными для других приложений? Я почти уверен, что он не использует несколько подключений для своего запроса.
Что я могу сделать, чтобы предотвратить это?
РЕДАКТИРОВАТЬ
У меня нет особых подробностей об оборудовании. Он использует обычные HDD, рейдированные, с Server 2k3. Это HP, которому, возможно, пару лет. В общем, я не вижу смысла в том, что проблема в оборудовании, поэтому я подумал, что, возможно, я что-то неправильно настроил?
решение1
Это означает, что у вас очень неоптимальный запрос. Обычные подозреваемые:
- нет или плохие индексы
- функции для столбцов в предложении WHERE (= игнорируемые индексы)
- преобразования/приоритет типов данных (= игнорируемые индексы)
- Скалярные udfs с доступом к таблице в предложениях SELECT (= влияние CURSOR)
- Запросы/объединение представлений с представлениями (Представление — это макрос, который расширяется)
Это также может быть простая проблема с ресурсами: возвращаемые данные касаются всей базы данных, поэтому они используют слишком много памяти, из-за чего вы получаете подкачку? Или вы получаете ожидания ASYNC_NETWORK_IO, что может означать, что клиент не принимает результаты так быстро, как должен?
Как правило, если вы используете сервер по максимуму, то это плохой код и/или дизайн, а не движок БД.
решение2
Если вы уверены, что оптимизировали все, что могли, вам стоит взглянуть на настройки параллелизма; по умолчанию используются все процессоры для параллельных запросов, вы можете изменить это на максимальное значение с меньшим числом в зависимости от количества процессоров, запрос может выполняться немного дольше, но он должен оставить достаточно вычислительной мощности для обслуживания запросов на вход. Если проблема касается только этого одного запроса, вместо того, чтобы изменять настройки всей системы, вы можете попросить своего коллегу изменить свой запрос, добавив параметр MAXDOP, чтобы посмотреть, поможет ли это.