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