Какие факторы ухудшают производительность задания SQL Server 2000? - PullRequest
1 голос
/ 04 октября 2008

В настоящее время мы выполняем задание SQL, которое ежедневно архивирует данные в 22:00. Однако конечные пользователи жалуются, что с 10 до 12 часов на странице отображается ошибка тайм-аута.

Вот псевдокод задания

while @jobArchive = 1 and @countProcecessedItem < @maxItem
     exec ArchiveItems @countProcecessedItem out
     if error occured
          set @jobArchive = 0
     delay '00:10'

Хранимая процедура ArchiveItems захватывает 100 лучших элементов, созданных 30 дней назад, обрабатывает и архивирует их в другой базе данных и удаляет элемент в исходной таблице, включая другие связанные с ней таблицы. наконец устанавливает @countProcecessedItem с номером обработанного элемента. ArchiveItems также создает и удаляет временные таблицы, которые он использовал для хранения некоторых записей.

Примечание: , если предоставленная мной информация является неполной, ответьте, и я с удовольствием добавлю дополнительную информацию, если это возможно.

Ответы [ 3 ]

1 голос
/ 04 октября 2008

Пока процесс ArchiveItems удаляет 100 записей, он блокирует таблицу. Убедитесь, что у вас есть индексы для быстрого выполнения удаления; запустите сеанс Profiler в течение этого периода времени и посмотрите, сколько времени это займет. Вам может понадобиться добавить индекс в поле даты, если он выполняет сканирование таблицы или сканирование индекса, чтобы найти записи.

На стороне конечного пользователя вы можете добавить подсказку READUNCOMMITTED или NOLOCK к запросам; это позволяет выполнить запрос во время удаления, но с возможностью возврата записей, которые должны быть удалены.

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

1 голос
/ 08 октября 2008

Как уже упоминалось в другом постере, медленные УДАЛЕНИЯ часто бывают вызваны отсутствием подходящего индекса, или требуется перестроение подходящего индекса.

Во время УДАЛЕНИЯ нередко эскалация блокировок ROW -> PAGE -> TABLE. Вы уменьшаете блокировку на

  • Добавление подсказки ROWLOCK (но помните скорее всего он будет занимать больше памяти)

  • Рандомизация строк, которые удален (делает эскалацию блокировки меньше вероятно)

  • Самый простой: добавление короткой ОЖИДАНИЯ в ArchiveItems

    КОГДА-то НАЧАТЬ

    УДАЛИТЬ несколько строк

    - Дайте другим процессам шанс ... ЗАДЕРЖКА ОЖИДАНИЯ '000: 00: 00.250'

    END

Я бы не использовал подсказку NOLOCK, если удаление происходит во время периодов, когда происходит другая активность, и вы хотите сохранить целостность ваших данных.

1 голос
/ 04 октября 2008

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

  • Установите «логический» флаг удаления в соответствующей строке и учтите его в запросе, который вы делаете для чтения данных
  • Выполнять удаление в пакетном режиме. Я обнаружил, что (в моем приложении) удаление около 250 строк в каждой транзакции дает более быструю операцию, которая занимает намного меньше времени, чем отдельная команда 250 delete

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...