SQL Server долго выполняющий запрос, занимающий часы, но использующий низкую загрузку ЦП
Я выполняю некоторые хранимые процедуры в SQL Server 2012 под Windows Server 2012 на выделенном сервере с 32 ГБ ОЗУ и 8 ядрами ЦП. Загрузка ЦП всегда ниже 10%, а использование ОЗУ - 80%, поскольку для SQL Server назначено 20 ГБ (из 32 ГБ).
Существуют некоторые хранимые процедуры, которые занимают 4 часа в некоторые дни, а другие дни, с почти такими же данными, занимают 7 или 8 часов.
Я использую наименее ограничительный уровень изоляции, поэтому я думаю, что это не должно быть проблемой блокировки. Размер базы данных составляет около 100 ГБ, а самая большая таблица содержит около 5 миллионов записей.
Процессы имеют массовые вставки, обновления и удаления (в некоторых случаях я могу использовать усечение, чтобы избежать создания журналов и сэкономить время). Я делаю несколько запросов полнотекстового поиска в одной таблице.
У меня есть полный контроль над сервером, поэтому я могу изменить любой параметр конфигурации.
У меня есть несколько вопросов:
- Можно ли улучшить производительность запросов с помощью параллелизма?
- Почему загрузка процессора такая низкая?
- Каковы лучшие практики для настройки SQL Server?
- Каковы лучшие бесплатные инструменты для аудита сервера? Я попробовал один из Microsoft под названием SQL Server 2012 BPA, но отчет всегда пуст без предупреждений.
РЕДАКТИРОВАТЬ: я проверил журнал, и я нашел это:
18.03.2015 11:09:25,spid26s, неизвестно,SQL Server обнаружил 82 возникновения запросов ввода-вывода, выполнение которых заняло более 15 секунд для файла [C:\Program Files\Microsoft SQL Server\MSSQL11.HLSQLSERVER\MSSQL\DATA\templog.ldf] в базе данных [tempdb] (2). Дескриптор файла ОС - 0x0000000000000BF8. Смещение последнего длинного ввода-вывода: 0x00000001fe4000
2 ответа
- Увеличьте максимальную память до 24 ГБ.
- Переместите tempdb с диска c и рассмотрите несколько файлов tempdb с автоматическим увеличением как минимум до 128 Мбит / с или 256 Мбит / с.
- Установите панель мониторинга производительности и запустите отчет панели мониторинга производительности, чтобы увидеть, какие запросы выполняются, и проверить ожидания.
- Если вы используете alto frow для журнала данных пользователя и файлов журналов на 10%, измените его на что-то похожее на рост tempdb выше.
- Использование панели мониторинга производительности для выявления очевидных отсутствующих индексов, которые прогнозируют влияние улучшения на 95% или более.
- Не обращайте внимания на всех недобросовестных Сэйеров, которые говорят не делать то, что я предлагаю. Если вы делаете эти 5 вещей, но у вас все еще возникают проблемы, опубликуйте некоторые результаты с панели мониторинга производительности, которая, кстати, бесплатна.
- Еще одна вещь, которая может оказаться полезной, скачать и установить хранимую процедуру sp_whoisactive, запустить ее и посмотреть, какие процессы запущены. Исследуйте запросы, которые вы найдете после запуска sp_whoisactive.
запрос занимает несколько часов, но использует низкий процессор
Вы говорите так, как будто процессор будет иметь значение для большинства операций с БД. ПОДСКАЗКА: они не делают.
Базы данных нуждаются в IO. Оперативная память греха в некоторых случаях помогает смягчить это, но в конце концов она снижается до IO.
И вы знаете, что я вижу в вашем вопросе? Процессор, память (как-то при условии, что 32 ГБ впечатляет), но НЕТ СЛОВА НА ДИСКОВЫХ РАСПИСАНИЯХ
И это то, что имеет значение. Диски, раздача файлов для распределения нагрузки.
Если вы посмотрите на счетчики производительности, то увидите, что задержка очень высока на дисках - потому что, какой бы "жалкой" (в терминах sql server) структура диска у вас ни была, она просто не соответствует задаче.
Время начинать покупать. SSD намного дешевле, чем диски. Вы можете сказать "О, как они дешевле". Ну, вы не покупаете ГБ - вы покупаете IO. И в прошлый раз, когда я проверял, SSD не стоил в 100 раз дороже дисков - но они имеют 100 и более раз IO. и мы всегда говорим о случайных IO.
Затем изолируйте Tempdb на отдельном SSD - tempdb или ничего не делает, или TON, и вы хотите это увидеть.
Затем изолируйте файл журнала.
Создайте несколько файлов данных для базы данных и базы данных tempdb (особенно для базы данных tempdb - столько, сколько у вас есть ядер).
И да, это будет стоить денег. Но в конце - вам нужен IO, и, как и большинство разработчиков, у вас есть процессор. Плохо для базы данных.