Аналогичный вопрос: Как автоматически выполнить повторное заполнение после использования identity_insert?
У меня есть хранимая процедура, которая запускается один раз в день, часть этой процедуры заключается в удалении ~ миллиона строк из таблицыи повторно вставьте аналогичное количество строк (есть миллионы других строк, которые не затронуты), как только он заканчивает, он перестраивает все индексы таблицы, готовые к использованию.
В отношении производительности, у меня нет проблемединственное раздражение - чрезмерный размер первичного ключа - первичный ключ - IDENTITY
INT
- очевидно, удаление миллиона строк и повторная вставка оставляет мне пробел ~ 1000000 каждый день.
Итак, я хочу повторно заполнить столбец идентификатора после DELETE
до INSERT
.
Я знаю, что могу использовать CHECKIDENT
для повторного заполнения столбца идентификаторов - но только если новое начальное значениеизвестен перед вызовом CHECKIDENT
- то есть с использованием MAX()
непосредственно перед CHECKIDENT
.
Моя таблица является таблицей с очень высоким трафиком, хотя маловероятно, что существует небольшая вероятность того, чтодругие операции вставки / удаления могут быть предприняты во время этого процесса, поэтому я немного беспокоюсь о том, чтобы прибегнуть к MAX () + 1 для определения моего нового начального значения (т. е. строки, вставленной откуда-то еще после выполнения MAX (), но дозавершение CHECKIDENT - что приведет к ошибке), например:
DECLARE @NewSeed INT
SELECT @NewSeed = ISNULL(MAX(IdentityColumn), 0)
FROM tbl_Whatever
DBCC CHECKIDENT('tbl_Whatever', RESEED, @NewSeed)
Мой вопрос: есть ли более приятный способ выполнить повторное заполнение на основе текущего максимального значения столбца Identity?- Я предполагаю, что ответ - нет, но просто подумал, что я спрошу.
Версия SQL - 2008 R2