2011-12-28 2 views
2

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

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

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

Кажется маловероятным, что было 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); 
+1

у вас есть состояние гонки там. Этот шаблон не будет работать при параллелизме [как показано здесь] (http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there) –

+0

Имеет ли 'DataText' уникальное ограничение на него? Возможно, вы действительно столкнулись со всей нагрузкой откатов. –

+0

'DataText' не имеет ограничения, но другой столбец' DateCreated' (заполненный значением по умолчанию 'getdate()') имеет его. – finoutlook

ответ

4

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

  • удаления
  • Явных откатов
  • нарушения ограничений (= подразумеваемый откат)
  • SET IDENTITY_INSERT
  • репликация без NOT FOR REPLICATION пункта
  • DBCC CHECKIDENT (редактирование: согласно ответу Олега ДОКА в) .. .

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

+0

Increment is 1, не делая никаких удалений на столе. Я посмотрю на ограничения. – finoutlook

+1

@finoutlook: добавлено больше идей – gbn

2

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

  • SET IDENTITY_INSERT
  • DBCC CHECKIDENT (..., переустановка)
+1

Я добавил DBCC CHECKIDENT к моему ответу, забыл об этом. ура – gbn

Смежные вопросы