Автоматически установить новое начальное значение на Identity - PullRequest
1 голос
/ 30 марта 2012

Аналогичный вопрос: Как автоматически выполнить повторное заполнение после использования 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

Ответы [ 2 ]

1 голос
/ 30 марта 2012

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

0 голосов
/ 30 марта 2012

Как сказал Демс, установка Identity на значение Max + 1 не устраняет пробелы.
Это более сложно, но оно заполняет пробелы.

  1. delete
  2. сбросить идентичность(в транзакции)
  3. определить, есть ли пропуски
  4. , если есть пропуски, вставить строки с помощью SET IDENTITY_INSERT ON и заполнить пропуски

Очевидно, хранимая процедуранеобходимо определить следующее значение разрыва.

Если вы вставляете столько, сколько удаляете, вам даже не нужно сбрасывать идентификатор.

Я думаю, что вы можете даже использовать другие горячие вставкии они будут использовать автоматический идентификатор

Из документации http://msdn.microsoft.com/en-us/library/ms188059.aspx

В любое время только одна таблица в сеансе может иметь свойство IDENTITY_INSERT, установленное в ON.Если для таблицы это свойство уже установлено на ON, и для другой таблицы выдается инструкция SET IDENTITY_INSERT ON, SQL Server возвращает сообщение об ошибке, в котором говорится, что SET IDENTITY_INSERT уже включена, и сообщает о таблице, для которой установлено значение ON.

Если введенное значение больше текущего значения идентификатора для таблицы, SQL Server автоматически использует новое вставленное значение в качестве текущего значения идентификатора.

...