Re: Reduce cleanup lock contention on standby replay

From: SATYANARAYANA NARLAPURAM <satyanarlapuram(at)gmail(dot)com>
To: Peter Geoghegan <pg(at)bowt(dot)ie>
Cc: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Andres Freund <andres(at)anarazel(dot)de>
Subject: Re: Reduce cleanup lock contention on standby replay
Date: 2026-07-11 02:47:50
Message-ID: CAHg+QDdVtRyYaYb8Un9uE4AXWfoYQ6ahGe6n+Aje2SFgADEAjA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi Peter,

On Fri, Jul 10, 2026 at 4:21 PM Peter Geoghegan <pg(at)bowt(dot)ie> wrote:

> On Fri, Jul 10, 2026 at 6:40 PM SATYANARAYANA NARLAPURAM
> <satyanarlapuram(at)gmail(dot)com> wrote:
> > Both flags are set only when:
> > - The index is unique (rd_index->indisunique)
> > - Scan keys cover all key columns (NumScanKeys >= indnkeyatts)
>
> I think that carrying around metadata indicating "unique scan,
> guaranteed to return 0 or 1 rows under MVCC" could be useful in a few
> places.
>
> Are you careful about NULLs/IS [NOT] NULL conditions? Those aren't
> guaranteed to return 0 or 1 rows with an MVCC snapshot, even with a
> unique index.

You are right, this needs to be handled better. Let me review and fix.

>
>
> > This guarantees at most one heap page visit per scan, so there is no
> same-page pin reuse benefit to preserve (unlike range scans where
> consecutive tuples often share a buffer).
> > I didn't see any obvious difference in performance with this change
> because the materialize cost (one heap_copytuple per point lookup) is
> negligible compared to
> > the index traversal + buffer lock cycle.
>
> Are you familiar with the amgetbatch interface that some of us have
> been working on to enable index prefetching? Tomas Vondra and I talked
> about the architecture at pgConf.dev:
>
> https://2026.pgconf.dev/session/659
>
> That might complement work in this area. As the talk goes into, a big
> emphasis of the work is to centralize knowledge of the progress of
> index scans in one place (namely heapam_indexscan.c) to enable work
> reordering. The table AM is at liberty to do work in whatever order is
> fastest or most convenient, as long as that doesn't break the index
> scan's semantics. We need this for prefetching, but it's actually a
> very general strategy.
>
> Many index scans return a range of rows whose TIDs all came from the
> same index leaf page. With such an index scan, there'll only be one
> call to amgetbatch. The first time amgetbatch returns it'll usually
> already be clear that it's the first and last batch; this can be
> determined right after the first/only amgetbatch call. You can see
> everything almost immediately, or at least easily see into the near
> future -- without any added overhead. This should make it possible to
> intelligently decide whether to eagerly fetch and materialize tuples
> in more complicated cases -- lots of relevant context is readily
> available in one place.

Thanks, I will go through this.

Thanks,
Satya

In response to

Browse pgsql-hackers by date

  From Date Subject
Previous Message Noah Misch 2026-07-11 02:42:34 Re: postgres_fdw could deparse ArrayCoerceExpr