Назад | Перейти на главную страницу

Производительность и блокировка SQL Server

У меня есть экземпляр SQL Server 2000, который выполняет несколько параллельных операторов выбора для группы из 4 или 5 таблиц. Часто производительность сервера во время этих запросов резко снижается. Запросы могут занимать до 10 раз больше времени, чем другие запуски того же запроса, и доходит до того, что простые операции, такие как получение списка таблиц в проводнике объектов или запуск sp_who, могут занять несколько минут.

Я приложил все усилия, чтобы определить причину этих проблем, и единственный показатель производительности, который, как я обнаружил, не соответствует базовому уровню, - это Среднее время ожидания блокировки. Я читал, что время ожидания более 1 секунды - это плохо, а у меня колеблется от 20 до 75 секунд при интенсивном использовании.

Итак, мой вопрос, в чем может быть проблема? Разве SQL не должен иметь возможность обрабатывать несколько выборок в одной таблице без такой потери производительности? Может ли кто-нибудь предложить куда-нибудь пойти отсюда, чтобы исследовать эту проблему?

Спасибо за помощь.

Зависит от блокировки. Большинство людей полностью забывают заботу о замках. Стандартные соединения устанавливают полную блокировку чтения (повторяющиеся чтения), которые могут использовать ресурсы.

Если вы ТОЛЬКО читаете, ТОЛЬКО читаете один раз, используйте соединение, помеченное способом, и оператор sql, помеченный таким образом, чтобы НЕ оставлять НИКАКИХ блокировок.

Было бы применимо для большинства страниц asp.net - вы читаете, представляете страницу ... нет необходимости держать блокировки для этой операции, только когда вы начинаете писать.

Если приложение действительно выполняет только чтение этой таблицы, блокировка не должна быть проблемой. Я буду:

  1. Убедитесь, что таблица имеет соответствующие индексы для выполняемых запросов. Один из этих индексов должен быть кластеризованным.
  2. Убедитесь, что индексы были перестроены или статистика таблиц обновлялась в недавнем прошлом.
  3. Посмотрите на производительность диска, это обычная проблема. Если количество секунд / передач превышает несколько десятков миллисекунд, попробуйте найти способ минимизировать объем выполняемых операций ввода-вывода (что обычно означает добавление индексов, изменение схемы таблицы или изменение запросов) или улучшить производительность дисковой подсистемы. Это может означать перемещение файлов на разные диски, изменение уровней RAID, изменение политики контроллера RAID и т. Д.
  4. Для SQL2000 я бы убедился, что процессоры отключили Hyper Threading.

SQL Server 2000 использует механизм блокировки это обновляет замки чтобы охватить все больше и больше схемы - то есть вы можете начать блокировать страницу таблицы, но по мере того, как вы блокируете больше строк, эта блокировка быстро будет повышена до полной блокировки таблицы. Для некоторых типов запросов это может полностью убить производительность.

Настолько, что MS изменила механизм блокировки в более поздних версиях, чтобы он больше походил на блокировку на уровне строк Oracles.