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