У меня есть большая база данных SQL Server с таблицей около 45 миллионов записей. Я архивирую эту таблицу и мне нужно удалить все записи больше двух лет назад. У меня вставка в мою таблицу архивов работает нормально, но у меня проблемы с эффективностью при удалении.
Моя проблема заключается в индексах, находящихся в настоящее время в таблице. Я хотел бы удалить (и архивную вставку) в 1000 блоков записей. Для этого мне нужно определить "лучшие" 1000 записей, удовлетворяющих требованию (больше двух лет). Штамп DateTime в строке является кластеризованным индексом, поэтому это отлично подходит для захвата строк. Однако SQL 2000 не позволяет DELETE TOP 1000.... так что мне нужно сделать что-то вроде:
DELETE FROM <table> WHERE [UniqueID] IN
(SELECT TOP 1000 [UniqueID] FROM <table> WHERE [DateTime] < @TwoYearsAgo)
Это отлично работает, если UniqueID был проиндексирован. Так как это не так, это занимает очень много времени (это сканирование таблицы для каждой из 1000 записей, которые нужно удалить). В таблице нет других индексов, которые однозначно идентифицируют записи. Мне сказали, что было бы слишком дорого вычислить индекс на UniqueID, так как это живая БД. Может ли кто-нибудь указать способ оптимизации этого запроса?