pg.ddx.io  pgsql-performance@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Justin Pryzby <pryzby@telsasoft.com>
To: Tobias Gierke <tobias.gierke@code-sourcery.de>
Cc: pgsql-performance@postgresql.org
Subject: Re: Linear slow-down while inserting into a table with an ON INSERT trigger ?
Date: Fri, 16 Jul 2021 23:40:26 -0500
Message-ID: <20210717044026.GA19498@telsasoft.com> (raw)
In-Reply-To: <62070f97-13e7-df73-bed1-f8e48c12bf2d@code-sourcery.de>
References: <62070f97-13e7-df73-bed1-f8e48c12bf2d@code-sourcery.de>

On Fri, Jul 16, 2021 at 11:27:24PM +0200, Tobias Gierke wrote:
> CREATE OR REPLACE FUNCTION parent_table_changed() RETURNS trigger LANGUAGE plpgsql
> AS $function$
> BEGIN
>     UPDATE data_sync SET last_parent_table_change=CURRENT_TIMESTAMP;
>     RETURN NEW;
> END;
> $function$
> 
> I'm trying to insert 30k rows (inside a single transaction) into the parent

The problem is because you're doing 30k updates of data_sync within a txn.
Ideally it starts with 1 tuple in 1 page but every row updated requires
scanning the previous N rows, which haven't been vacuumed (and cannot).
Update is essentially delete+insert, and the table will grow with each update
until the txn ends and it's vacuumed.

        pages: 176 removed, 1 remain, 0 skipped due to pins, 0 skipped frozen
        tuples: 40000 removed, 1 remain, 0 are dead but not yet removable, oldest xmin: 2027

You could run a single UPDATE rather than 30k triggers.
Or switch to an INSERT on the table, with an index on it, and call
max(last_parent_table_change) from whatever needs to ingest it.  And prune the
old entries and vacuum it outside the transaction.  Maybe someone else will
have a better suggestion.

-- 
Justin





view thread (10+ messages)  latest in thread

Message-ID: <20210717044026.GA19498@telsasoft.com>
Permalink:  ../20210717044026.GA19498@telsasoft.com/
Also on:    postgresql.org/message-id/20210717044026.GA19498@telsasoft.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-performance@postgresql.org
  Cc: pryzby@telsasoft.com, tobias.gierke@code-sourcery.de
  Subject: Re: Linear slow-down while inserting into a table with an ON INSERT trigger ?
  In-Reply-To: <20210717044026.GA19498@telsasoft.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox