2014-02-10 4 views
0

(Использование Oracle) У меня есть таблица с одним столбцом (myCol), который является первичным ключом.PLSQL - Самый быстрый способ проверить наличие дубликатов перед вставкой

Выполнение вставки, быстрее ли проверять с помощью инструкции выбора перед выполнением вставки или просто записать вставку и разрешить обработку ошибок?

Так будет ли это быстрее?

BEGIN 

SELECT count(*) INTO v_count FROM myTbl WHERE myCol = v_newVal; 

IF v_count = 0 THEN 
    INSERT INTO myTbl (myCol) VALUES (v_newVal); 
END IF; 

END; 

или этот?

BEGIN 

INSERT INTO myTbl (myCol) VALUES (v_newVal); 

EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
    null; 

END; 

Спасибо!

ответ

1

С точки зрения производительности, конечно, второй вариант лучше.

Но, что более важно, первый вариант имеет ошибку - он потерпит неудачу в случаях, когда более одного сеанса пытается вставить одно и то же значение одновременно - один из них будет успешным, другой сеанс будет ждать сначала совершить, а затем поднять DUP_VAL_ON_INDEX (который вы не обрабатывали).

1

Я думаю, вы могли бы попробовать слиться. Обычно вам следует избегать count() от проверки дубликатов. Существует также подсказка, которую вы можете использовать, чтобы игнорировать дубликаты. Эта страница дает хороший пример этого.

http://guyharrison.squarespace.com/blog/2010/1/1/the-11gr2-ignore_row_on_dupkey_index-hint.html

+0

Ссылка, которую вы указали, указывает на то, что использование подсчета является наилучшим методом ... – mang

+0

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

+1

Счет может быть дорогостоящим, и он может разрушить кеш других будущих выборов, поскольку множество записей будет проанализировано и прочитано. Начать без count() только усложнить задачу, если у вас есть проблема с производительностью. Наконец, даже если вы делаете count(), вам по-прежнему нужна обработка исключений из-за параллелизма. – odedsh

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