Извините за длинное вступление, но прежде чем я смогу задать свой вопрос, я думаю, что предыстория поможет лучше понять нашу проблему.
Мы используем sql server 2008 для наших веб-сервисов в качестве серверной части, и время от времени требуется слишком много времени для ответа на запросы, которые должны выполняться очень быстро, например, требуется более 20 секунд для запроса на выборку, который запрашивает таблицу. в котором всего 22 строки. Мы рассмотрели множество потенциальных областей, которые могут вызвать проблему, от индексов до хранимых процедур, триггеров и т. д., и попытались оптимизировать все, что можно, например, удалив индексы, которые не читаются, но часто записываются, или добавив NOLOCK для наших запросов на выборку, чтобы уменьшить блокировку таблицы (у нас все в порядке с грязными чтениями).
Мы также попросили наших администраторов базы данных проверить сервер и протестировать компоненты, чтобы увидеть любые узкие места в ЦП, памяти или дисковой подсистеме, и обнаружили, что с аппаратным обеспечением у нас все в порядке. А поскольку пики случаются время от времени, очень сложно воспроизвести ошибку в производстве или разработке, потому что в большинстве случаев, когда мы повторно запускаем один и тот же запрос, он дает ожидаемое время отклика, которое короткое, а не то, которое было испытал ранее.
Сказав это, я почти с подозрением отнесся к вводу-выводу, хотя это не кажется узким местом. Но я думаю, что смог просто воспроизвести ошибку после запуска отчета о фрагментации индекса для конкретной таблицы на сервере, что немедленно вызвало пики в запросах не только к этой таблице, но и к другим запросам, которые запрашивают другие таблицы. И поскольку БД и сервер используются совместно с другими приложениями, которые мы используем, а также время от времени запросы могут выполняться на сервере, а база данных, которая занимает много времени, является для нас обычным сценарием, я подозреваю, что случайные узкие места ввода-вывода полагаю, становится фактом.
Поэтому я хочу найти способ, который будет определять приоритеты запросов, поступающих от веб-служб, которые будут обрабатываться, даже если выполняются другие запросы, чувствительные к ресурсам. Я искал какую-то описанную выше приоритизацию с самого начала процесса разрешения и обнаружил, что в SQL Server 2008 есть функция под названием «Регулятор ресурсов», которая позволяет приоритизировать запросы.
Однако, поскольку я не являюсь экспертом по Resource Governor и не являюсь администратором баз данных, я хотел бы узнать об опыте других людей, которые могли использовать или используют Resource Governor, а также могу ли я расставить приоритеты ввода-вывода для определенного входа в систему или определенного хранимая процедура (например, если один процесс с интенсивным вводом-выводом выполняется в то время, когда мы получаем запрос веб-службы, может ли сервер SQL остановить или замедлить активность ввода-вывода для этого процесса и дать приоритет запросу, который мы только что получили?).
Спасибо всем, кто тратит время на чтение или помощь заранее.
Некоторые сведения об оборудовании:
ЦП: 2x Quad Core AMD Opteron 8354
Память: 64 ГБ
Дисковая подсистема: Серия Compaq EVA8100 (я не уверен, но должен быть RAID 0+1 на 8 дисках HP HSV210 SCSI)
PS: И я почти на 100% уверен, что серверы приложений не вызывают ошибку, и мы не можем определить там узкое место.
Обновление 1:
Я постараюсь ответить как можно больше на следующие вопросы, которые gbn задал ниже. Пожалуйста, дайте мне знать, если вы ищете что-то еще.
1) Какие виды обслуживания индексов и статистики у вас есть?
Каждую пятницу у нас есть еженедельная работа по дефрагментации индексов. Кроме того, включены функции автоматического создания статистики и автоматического обновления статистики. И всплески происходят и в другое время, кроме работы фрагментации.
2) Какие объемы данных для записи у вас есть?
Трудно ответить. В дополнение к нашим веб-сервисам существует внешнее приложение, которое обращается к той же базе данных, и, насколько мне известно, периодически необходимо выполнять ресурсоемкие запросы, однако я не знаю, как получить, скажем, еженедельно или ежедневно, количество записей в БД.
3) Вы профилировали события перекомпиляции и обновления статистики?
Извините, что не смог разобраться в этом. Я не понял, о чем вы спрашиваете этим вопросом. Можете ли вы предоставить дополнительную информацию по этому вопросу, если это возможно?