Select and Create_If_Not_Available по сравнению с Create всегда для таблицы с уникальным ограничением

Пожалуйста, разберитесь с этим основным вопросом.

У меня есть таблица T с уникальным ограничением на составные столбцы «A» и «B».

При создании записи в T у меня есть два варианта:

<сильный>1. Выберите и создайте_если_недоступно

а. Выберите * из T, где A='a' и B='b'. б. Если запись недоступна, создайте новую запись (с обработкой ConstraintViolation из-за состояния гонки), в противном случае перейдите к следующему шагу.

<сильный>2. Создавайте всегда

а. Создать запись в БД (с обработкой ConstraintViolation и опираясь на уникальное ограничение базы данных).

По моему мнению, у 2-го будет меньше запросов к БД и ответов в базе данных (вне кода приложения).

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

Учитывая высокий масштаб, какой из них я должен предпочесть и почему?

Я использую Java, Hibernate и Oracle.

Спасибо,


person instanceOfObject    schedule 29.11.2013    source источник


Ответы (1)


То, что база данных делает на шаге 2, все равно придется делать на шаге 1, поэтому с точки зрения чистой эффективности шаг 2 лучше. Почему вас волнует «зависимость от уникальных ограничений»? С точки зрения честности они вам нужны.

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

person DCookie    schedule 29.11.2013
comment
Да, приложение пытается часто создавать/вставлять/обновлять существующие ключи. - person instanceOfObject; 02.12.2013
comment
Вы рассматривали MERGE? Это может быть компромисс. Попробуйте и оцените результаты. - person DCookie; 02.12.2013