Влияет ли ConstraintViolationException на производительность в Postgres? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть таблица с уникальным ограничением на 2 столбца (user1 и user2), так что не может быть дублированной пары пользователей. Это выглядит так:

@Table(name = "relation", uniqueConstraints ={
        @UniqueConstraint(columnNames = { "user1", "user2" })
})
class Relation{}
...

Столбцы user1 и user2 являются uuid-char *

Когда я получаю данные от некоторого удаленного конца, я получаю список пар, которые я должен вставить в свою таблицу. Вот список, который я получаю:

{ user1: some-uuid, user2: some-other-uuid }
{ user1: some-uuid, user2: some-other-uuid }
{ user1: some-uuid, user2: some-other-uuid }
... + 1000 records

Затем я перебираю этот список и вставляю все пары:

for(Pair p : data){
    try{
        relationRepository.save(p);
    }
    catch(PostgresConstraintViolationException ex){
        log("Pair already exists, but that's ok")
    }
}

Мой вопрос:

Оказывает ли намеренное отловление ConstraintViolationException какое-либо влияние на производительность? Кажется, это намного лучше, чем проверка наличия пар в базе данных и вставка, если это не так. (1 запрос вместо 2).

Однажды я услышал, что "Это то, для чего существуют исключения". Я понимаю это, но я не уверен, как Postgres ведет себя в этой ситуации.

1 Ответ

1 голос
/ 21 июня 2019

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

Это очень хороший пост, на который стоит взглянуть.

...