Установка: SQL Server 2008 R2MS SQL индекс обновления значение
предыстория: У нас есть прок, который вызывается в несколько потоков одновременно. Эти потоковые запросы proc иногда записывают перекрывающиеся (дублированные) данные в таблицу, в которую они записываются. В инструкции insert у меня есть предложение NOT NOT EXISTS, чтобы убедиться, что дубликаты не вставлены, но мы все равно получаем дубликаты.
Вопрос: «НЕ СУЩЕСТВУЕТ» оговорка делает простой выбор, это возможно, так как вставки для резьбовых вызовов только миллисекунды друг от друга, что некоторые из индексов (в частности, те, которые используются «НЕ EXISTS ") еще не обновлены? Поэтому перед выполнением вставки она не видит существующей записи?
Мысли: Это может быть я, не понимающий, как SQL тоже делает свою вещь. Если у меня есть вставка с «WHERE NOT EXISTS», проверяется ли она, чтобы убедиться, что ни одна из записей не существует перед выполнением вставки? Или он проверяет строку за строкой, как она вставляет каждую строку? Если это первый (проверяя все, прежде чем делать какую-либо вставку), то я полагаю, что один из других вызовов еще не завершил его вставку.
Я в тупик.
Вот пример того, что я делаю:
INSERT INTO [SomeTable] (Col1,Col2) SELECT ColumnA, ColumnB FROM #TempTable WHERE NOT EXISTS ( SELECT 1 FROM [SomeTable] WHERE Col1 = #TempTable.ColumnA AND Col2 = #TempTable.ColumnB )
Не могли бы вы показать нам код? Угадывание занимает слишком много времени. См. [Написание идеального вопроса] (http://tinyurl.com/so-hints). – HABO
Используете ли вы транзакции в своем коде? –
Нет транзакций, а proc - 10 000 строк. :) Это прямая вставка, хотя она вставляет записи из таблицы temp в пользовательскую таблицу, где запись еще не существует. Если вы запустите proc для сотрудника, затем запустите его снова сразу после этого, он ничего не вставляет, поскольку он видит, что записи уже есть. 'Test' –