Выполнение обновлений на большой, интенсивно используемой таблице

У меня есть большая таблица (~170 миллионов строк, 2 столбца nvarchar и 7 столбцов int) в SQL Server 2005, в которую постоянно вставляются данные. С точки зрения производительности все работает нормально, но время от времени мне приходится обновлять набор строк в таблице, что вызывает проблемы. Он работает нормально, если я обновляю небольшой набор данных, но если мне нужно обновить набор из 40 000 записей или около того, это занимает около 3 минут и блокирует таблицу, что вызывает проблемы, поскольку вставки начинают давать сбой.

Если я просто запускаю select, чтобы получить данные, которые нужно обновить, я получаю 40 000 записей примерно за 2 секунды. Только обновления занимают вечность. Это отражено в плане выполнения обновления, где обновление кластерного индекса занимает 90% затрат, а поиск индекса и оператор top для получения строк занимают 10% затрат. Столбец, который я обновляю, не является частью какого-либо индексного ключа, так что это не похоже на реорганизацию чего-либо.

Есть ли у кого-нибудь идеи, как это можно ускорить? Сейчас я думаю написать службу, которая будет просто видеть, когда эти обновления должны произойти, вытаскивать записи, которые должны быть обновлены, а затем циклически обновлять их одну за другой. Это удовлетворит мои бизнес-потребности, но это еще один модуль для поддержки, и я бы хотел, чтобы я мог исправить это только со стороны DBA.

Спасибо за любые мысли!

6
задан kylememe 4 January 2012 в 17:30
поделиться