Что эквивалентно INSERT ... ON CONFLICT, который сначала пытается обновить? - PullRequest
0 голосов
/ 31 марта 2019

Я использовал INSERT ... ON CONFLICT DO UPDATE для вставки / обновления данных. Вопрос, который у меня возникает, состоит в том, что я знаю, что большую часть времени я захочу сделать обновление: каждый день обновлять счетчик. Если для этой даты нет данных, создайте строку. Это создание произойдет только один раз (очевидно), но обновление может происходить миллионы раз в день. Использование INSERT ... ON CONFLICT DO UPDATE все еще правильный подход? есть ли эквивалент «попробуйте сначала обновить, если не получится, затем вставьте строку»? (как настоящий "UPSERT").

1 Ответ

1 голос
/ 31 марта 2019

Нет варианта UPDATE, который бы имел такое же поведение, по той простой причине, что он делал бы то же самое, что и INSERT ... ON CONFLICT. Не беспокойся об имени.

Если у вас есть миллионы обновлений для каждой строки в день, вам стоит беспокоиться о VACUUM.

Если вы можете, не индексируйте атрибуты, которые будут часто обновляться, и создайте таблицу с fillfactor ниже 100. Вы можете получить гораздо более эффективные & ldauo; HOT updates & rdquo ;, которые значительно уменьшат количество записи на диск и VACUUM требуется.

Обязательно настройте автовакуум на более агрессивный, уменьшив значение autovacuum_vacuum_cost_delay.

...