Приоритизация ввода-вывода для конкретного запроса запроса на сервере SQL

Извините за длинное вступление, но прежде чем я смогу задать свой вопрос, я думаю, что предыстория поможет лучше понять нашу проблему.

Мы используем 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) Вы профилировали события перекомпиляции и обновления статистики?
Извините, что не смог разобраться в этом. Я не понял, о чем вы спрашиваете этим вопросом. Можете ли вы предоставить дополнительную информацию по этому вопросу, если это возможно?


person Ferhat    schedule 15.11.2010    source источник


Ответы (2)


сначала подумалось, что статистика обновляются из-за достижения порога изменения данных, что приводит к перестроению планов выполнения.

  • Какой у вас индекс и ведение статистики? Примечание: обслуживание индекса обновляет статистику индекса, а не статистику столбца: вам могут потребоваться отдельные обновления статистики.
  • Какие объемы данных для записи у вас есть?
  • Вы профилировали события перекомпиляции и обновления статистики?
person gbn    schedule 15.11.2010
comment
Да, обновление статистики тоже было моей первой мыслью, но тогда, при рассмотрении таблицы из 22 записей, вероятно ли это? Я думаю, нам нужно больше узнать о волатильности данных в таблице. Рекомпиляция, безусловно, возможна. Плакат должен уметь измерять время компиляции плохо выполняющегося запроса. - person John Sansom; 15.11.2010
comment
@John Sansom: 22-я строка может блокировать. Возможно, это тоже вводит в заблуждение с остановкой сервера - person gbn; 15.11.2010
comment
Мне нужно найти ответы на вопросы, которые вы задали, ребята, так как я не очень хорошо знаком с этим. Постараюсь вернуться как можно скорее, но может пройти некоторое время, прежде чем я получу ответы от нашей группы администраторов баз данных. Спасибо за интерес. - person Ferhat; 15.11.2010
comment
@gbn: Действительно. @Ferhat: Держите нас всех в курсе событий с этим. - person John Sansom; 19.11.2010
comment
@John: я уже представил обновление в исходном сообщении для ответов на вопросы, которые gbn задавал ранее, спасибо за проверку. - person Ferhat; 19.11.2010

В ответ на вопрос 3) вашего обновления исходного вопроса ознакомьтесь со следующей ссылкой в ​​SQL Server Pedia. В нем объясняется, что такое перекомпиляция запросов, а также объясняется, как вы можете отслеживать эти события. Я полагаю, что gbn спрашивает (не стесняйтесь поправлять меня, сэр :-)): видите ли вы события перекомпиляции перед медленным выполнением проблемного запроса. Вы можете найти это с помощью профилировщика SQL Server.

Причины перекомпиляции плана выполнения запроса

person John Sansom    schedule 20.11.2010
comment
Привет, Джон, спасибо за информацию и ссылку. Как только я проверю это и, надеюсь, выясню :), я постараюсь вернуться с любой дополнительной информацией, которую смогу найти. - person Ferhat; 22.11.2010