Issues with upserts

From: André Hänsel <andre(at)webkr(dot)de>
To: <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Issues with upserts
Date: 2022-07-13 13:35:54
Message-ID: 032201d896bd$7a948a10$6fbd9e30$@webkr.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

The wiki entry https://wiki.postgresql.org/wiki/UPSERT kind of suggests that
with the introduction of ON CONFLICT DO UPDATE the problem of upserts is
solved. But is it?

A common use case for upserts is to keep a table up to date from an external
data source. So you might have a cron job that runs a relatively large batch
of upserts every couple of minutes.

I have found that this use case is not adequately covered by ON CONFLICT DO
UPDATE for two reasons:

- New versions are created for all rows, even if the data is identical. This
quickly fills up the WAL and puts unnecessary load on the tablespace drives.

- If the conflict target is not the serial column, the sequence backing the
serial column gets incremented for every row. This quickly reaches the point
where the serial for new rows exceeds the range of an integer.

Does this mean I have to SELECT the data first and do the conflict check in
the application or is there a better SQL-only way?

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Jeremy Smith 2022-07-13 13:48:28 Re: Issues with upserts
Previous Message Laurenz Albe 2022-07-13 05:49:54 Re: Problem upgrading from 10 to 14 with pg_upgrade: unexpected error upgrading "template1" database for some clusters