Инкремент столбца идентификации SQL Server без вставки - PullRequest
3 голосов
/ 28 декабря 2011

У меня есть консольное приложение C #, которое использует хранимую процедуру для вставки строк в базу данных SQL Server.В настоящее время в базе данных имеется около 1 млн строк, однако столбец идентификаторов находится на 26 метрах!

При последней успешной вставке идентификатор увеличился с 16 до 26 миллионов.Приложение запускает несколько потоков параллельно, поэтому существует вероятность того, что оно может пытаться вставить две вещи одновременно.

Есть ли что-нибудь кроме отката транзакции, который может привести к увеличению столбца идентификаторов без добавленияrow?

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

Я использую переменную временной таблицы, которая заполняется передачейXML в хранимой процедуре:

-- insert data if it doesn-t already exist  
insert into DataStore (DataText, DataSourceID)
select distinct td.dataText, td.dataSource 
  from @tempData td
 where not exists ( select 'x' 
                      from DataStore ds 
                     where ds.DataText = td.dataText );

Ответы [ 2 ]

5 голосов
/ 28 декабря 2011

Что может оставить пробелы?

  • удаления
  • Явные откаты
  • Нарушения ограничений (= подразумеваемый откат)
  • SET IDENTITY_INSERT
  • Репликация без НЕ ДЛЯ РЕПЛИКАЦИИ предложение
  • DBCC CHECKIDENT (редактировать: согласно ответу Олега Док) ...

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

2 голосов
/ 28 декабря 2011

Вставленная и удаленная запись увеличивает счетчик идентификаторов, как упомянуто @gbn - Откаты и c-нарушения, но есть еще две опции:

  • SET IDENTITY_INSERT
  • DBCC CHECKIDENT(..., RESEED)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...