Используя Postgres SQL, какая самая быстрая транзакция для эмуляции UPSERT для одной строки? - PullRequest
2 голосов
/ 04 февраля 2011

Этот вопрос касается одной строки, а не набора. Мне просто любопытно, что быстрее использовать последнюю и самую лучшую версию Pg (9.0) и почему:

Условное ОБНОВЛЕНИЕ или ВСТАВКА на основе SELECT на PKEY

Попытка ВСТАВИТЬ, поймать исключение при сбое и вернуться к ОБНОВЛЕНИЮ

Попытка ОБНОВИТЬ, перехватить исключение при сбое и вернуться к INSERT

Я думаю, потому что это будет зависеть от набора данных, давайте предположим три сценария:

  • 50% строк присутствует, 50% нет
  • 100% строк присутствуют
  • 100% строк отсутствуют

Присутствие означает, что PKEYs удовлетворены, и строка должна быть обновлена. Любые ссылки на исследования по этому вопросу были бы великолепны.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Первый сценарий никогда не будет быстрее, чем два других, потому что SELECT, который вы запускаете первым, является ненужной дополнительной работой и также выполняется неявно UPDATE (и, возможно, INSERT).

Даже с распределением 50% / 50% я думаю, что использование UPDATE / INSERT будет немного быстрее, поскольку обработка ошибок (перехват исключения) занимает значительно больше времени, чем UPDATE, которая ничего не обновляет.

Таким образом, я бы использовал шаблон UPDATE / INSERT, если вы не знаете, что на самом деле lot (например,> 70%) строк не будет.

Но об этом может сказать только хороший тест производительности в вашей среде.

0 голосов
/ 08 мая 2015

В postgres 9.5 будет возможно выполнить фактическое upsert:

http://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=168d5805e4c08bed7b95d351bf097cff7c07dd65

INSERT [...] ON CONFLICT DO UPDATE SET [...] WHERE [...]
...