Как эффективно обрабатывать дубликаты клавиш без исключения - PullRequest
2 голосов
/ 12 сентября 2011

Мой сценарий случая передает параметр в процедуру, которая выполняет только вставку.Но два потока могут пытаться передать одно и то же значение.

Как справиться с этой ситуацией без исключения и с наименьшим количеством блокировок?

Моё требование к производительности - не менее 10 тыс. Вставок в секунду.

РЕДАКТИРОВАТЬ: столбец является уникальным.Временная метка может быть изменена (скорректирована) перед вставкой.

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

Создать индекс для таблицы с опцией игнорирования дубликата ключа.Он не будет вставлять повторяющиеся строки, а также не будет при любой ошибке.

Например

create unique index i1 on #tmp(id) with ignore_dup_key

insert into #tmp values(1,"A")
2> go
(1 row affected)


1> insert into #tmp values(1,"A")
2> go
Duplicate key was ignored.
(0 rows affected)
2 голосов
/ 13 сентября 2011

Как заметил @ Мартин Смит , есть хорошее решение - несмотря на то, что оно противоречит моему вопросу, у него есть веские основания, которые, похоже, хорошо поддерживаются.Оригинальный ответ, который вы можете найти здесь , опубликованный @gbn.

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Серьезно, это самый быстрый и самый параллельный процесс без блокировок, особенно вбольшие объемы.Что, если UPDLOCK увеличен, и вся таблица заблокирована?

Оригинальный текст Пола Нильсена вы можете найти здесь .- урок 4.

Если у кого-то есть похожая проблема с моей, хорошо бы взглянуть на нее.

2 голосов
/ 12 сентября 2011

Попробуйте оператор MERGE

Из MSDN.Распространенным сценарием является обновление одного или нескольких столбцов в таблице, если соответствующая строка существует, или вставка данных в виде новой строки, если соответствующая строка не существует.Обычно это делается путем передачи параметров в хранимую процедуру, которая содержит соответствующие операторы UPDATE и INSERT.С помощью оператора MERGE вы можете выполнять обе задачи в одном операторе.

Что касается ваших проблем с производительностью, на странице Оптимизация производительности оператора MERGE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...