![SQL Server 2008 постоянно читает MDF-файл, производительность ужасная](https://rvso.com/image/632763/SQL%20Server%202008%20%D0%BF%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%BD%D0%BE%20%D1%87%D0%B8%D1%82%D0%B0%D0%B5%D1%82%20MDF-%D1%84%D0%B0%D0%B9%D0%BB%2C%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D1%8C%20%D1%83%D0%B6%D0%B0%D1%81%D0%BD%D0%B0%D1%8F%20.png)
У нас есть приложение, которое запускает SQL Server 2008 R2 Express на бэкэнде на виртуальном сервере Windows 2008 R2, работающем на VMWare ESXi. Пользователи жалуются, что приложение работает очень медленно. Я вижу очень высокий дисковый ввод-вывод, который для меня не имеет смысла.
Фон:
- Средняя длина очереди диска составляет около 60, максимальная — около 250.
- Среднее количество операций чтения с диска в секунду составляет около 2000, максимальное — около 3500.
- Resource Monitor показывает, что sqlservr.exe читает файл .mdf со скоростью около 40-60 МБ/сек (см. ниже). Скорость ввода-вывода записи очень низкая.
- Файл .mdf весит всего 2 ГБ, а это значит, что он весь должен поместиться в памяти.
- На сервере установлено 32 ГБ оперативной памяти, из которых обычно используется менее 16 ГБ.
- На сервере установлено 8x 15k SAS-дисков в RAID10. Это Dell с контроллером PERC H710, который может использовать SSD для включения CacheCade (кэш чтения на основе SSD), что я и хотел бы попробовать, но, похоже, все это в любом случае должно кэшироваться в оперативной памяти, поэтому я не уверен, что это поможет.
- Виртуальная машина SQL установлена на сервере Dell под управлением VMWare ESXi 5. На этом хосте ESXi есть еще одна виртуальная машина, но это контроллер домена с очень небольшим объемом ввода-вывода.
- Это приложение ранее работало на автономном сервере Windows 2003. Мы обновились до Windows 2008 R2 и одновременно обновили приложение до более новой версии, так что, возможно, любой из этих факторов может быть причиной.
Какие есть варианты, чтобы разобраться в этом глубже? Есть ли способ увидеть, что SQL-сервер делает под капотом (какие запросы выполняются и т. д.)? Кажется ли такое поведение нормальным, и нагрузка просто слишком велика для хранилища? Мне интересно, что-то настроено неправильно.
решение1
http://msdn.microsoft.com/en-us/library/cc645993(v=sql.105).aspx#Масштабируемость
Espress не будет использовать более 1 ГБ оперативной памяти для процесса SQL. Вам нужно купить и установить как минимум Web или Standard, чтобы использовать более 4 ГБ — они оба поддерживают 64, что больше, чем у вас есть, так что выбирайте один из них.
Кроме того, быть администратором баз данных — довольно глубокая тема, но она легко доступна через Technet и файл справки. «Как узнать, какие запросы выполняются» — это, по сути, тема первого дня (как и знание того, какая редакция подходит для данной задачи). Profiler даже недоступен для Express, так что вы влипли в неприятности, учитывая ваши текущие настройки.
решение2
Посмотрите на детали запроса - проверьте запросы с высоким физическим или логическим вводом-выводом, изолируйте их, посмотрите на план запроса. Годами я использовал устаревшую версию вроде 2008 R2... http://gallery.technet.microsoft.com/scriptcenter/Find-ineffective-query-88f4611fможет дать вам повод для размышлений.
Я бы указал на отсутствие индексов, вызывающих сканирование таблиц. Мастера профилирования и настройки также могут помочь понять, где проблема. ЕСЛИ 2008 R2 уже имеет обзор активности в менеджере, то это имеет хорошее окно с самыми дорогими запросами.