Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vtY9J-00ETRz-1E for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 21:34:57 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vtY9I-009HYE-16 for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 21:34:56 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vtY9H-009HY5-0e for pgsql-hackers@lists.postgresql.org; Fri, 20 Feb 2026 21:34:56 +0000 Received: from fout-b4-smtp.messagingengine.com ([202.12.124.147]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vtY9D-00000000RVF-0VdY for pgsql-hackers@lists.postgresql.org; Fri, 20 Feb 2026 21:34:54 +0000 Received: from phl-compute-06.internal (phl-compute-06.internal [10.202.2.46]) by mailfout.stl.internal (Postfix) with ESMTP id 670651D000E8; Fri, 20 Feb 2026 16:34:48 -0500 (EST) Received: from phl-frontend-04 ([10.202.2.163]) by phl-compute-06.internal (MEProxy); Fri, 20 Feb 2026 16:34:48 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=anarazel.de; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm3; t=1771623288; x=1771709688; bh=moD4HUXQ9g MZCWbu+XtoaCclD5MEQpm9FjMLuWP5sSo=; b=bV7e+xZ3PCTfYJXqb69EYK5Wxf 8xfkfyv09jrT3D1LA7Au37lo9hKgKM/DAu1kl+YyFsqN63WnaK6OVgUvegcDM6q7 XR46i9Y4hZnn2k6PzstJCCvQHmBAAMRVc9BojSnXecZYVWkIhLVd0SXuF6b9ZiIC Do2p6Fw15Wg9xqDuqNxEpgdOvcxxQ5j9/307cJLrWbHKe98UsefevdSWceFXOso0 AhjoDldJHgQwd6Feh5fFVqsye/DqFVUygsj3rNqllthD7LwWAlpFulVshuYQsdvo uhEHNX2896RITpcN0RcQtqUiKgCW/IPgOTb6EMp5n/MDsT9AeAgr7n+7T+dg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t= 1771623288; x=1771709688; bh=moD4HUXQ9gMZCWbu+XtoaCclD5MEQpm9FjM LuWP5sSo=; b=G66igGooNvBMjo/TacMkBCtea/A5ShyZ2bUAfa4L+/ukOzK3xm+ Nv+4j96jFGz2cF4qgNnBprJu3PNhp7zMx7haRF7ZJ+8RgwydKh463hurrmdB7A/c uslnxsl7ilvPFRlHUTyHm8FBwQbjvN6IQuAwBbotQK0VKnizknhitallk3o+egkz R/GvtbEsr0db8JOXxk1mg8h+OwLH0AIfV3SX5fIvj0kclKstLCYt8odrz+7Nyhfd TSO76O6p2nZ1uAPtWp3KUCijGn78OzBc2w3IErLubnbaPaNv0Afc1Bk7dIJT5frW Skiu0pyKXvuvS8XrrB8wM6281Bw3xWsC5Nw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefgedrtddtgddvvdelheefucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfurfetoffkrfgpnffqhgenuceu rghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujf gurhepfffhvfevuffkfhggtggujgesthdtsfdttddtvdenucfhrhhomheptehnughrvghs ucfhrhgvuhhnugcuoegrnhgurhgvshesrghnrghrrgiivghlrdguvgeqnecuggftrfgrth htvghrnhepfeffgfelvdffgedtveelgfdtgefghfdvkefggeetieevjeekteduleevjefh ueegnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomheprg hnughrvghssegrnhgrrhgriigvlhdruggvpdhnsggprhgtphhtthhopeekpdhmohguvgep shhmthhpohhuthdprhgtphhtthhopehlihdrvghvrghnrdgthhgrohesghhmrghilhdrtg homhdprhgtphhtthhopehmvghlrghnihgvphhlrghgvghmrghnsehgmhgrihhlrdgtohhm pdhrtghpthhtoheprhgvshhhkhgvkhhirhhilhhlsehgmhgrihhlrdgtohhmpdhrtghpth htoheprhhosggvrhhtmhhhrggrshesghhmrghilhdrtghomhdprhgtphhtthhopeiguhhn vghnghiihhhouhesghhmrghilhdrtghomhdprhgtphhtthhopehhlhhinhhnrghkrgesih hkihdrfhhipdhrtghpthhtohepphhgshhqlhdqhhgrtghkvghrsheslhhishhtshdrphho shhtghhrvghsqhhlrdhorhhgpdhrtghpthhtohepgiegmhhmmheshigrnhguvgigqdhtvg grmhdrrhhu X-ME-Proxy: Feedback-ID: id4a34324:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 20 Feb 2026 16:34:47 -0500 (EST) Date: Fri, 20 Feb 2026 16:34:47 -0500 From: Andres Freund To: Melanie Plageman Cc: Andrey Borodin , Kirill Reshke , Chao Li , Xuneng Zhou , Robert Haas , PostgreSQL Hackers , Heikki Linnakangas Subject: Re: eliminate xl_heap_visible to reduce WAL (and eventually set VM on-access) Message-ID: References: <6BC5DBAB-6084-4BB8-8450-52E9648AB021@gmail.com> <7F5BCD7A-764D-4D8D-8E27-6F2CAAEA1CEE@gmail.com> <4379FDA3-9446-4E2C-9C15-32EFE8D4F31B@yandex-team.ru> <7ib3sa55sapwjlaz4sijbiq7iezna27kjvvvar4dpgkmadml6t@gfpkkwmdnepx> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk Hi, On 2026-01-28 18:16:10 -0500, Melanie Plageman wrote: > Subject: [PATCH v34 13/14] Allow on-access pruning to set pages all-visible > > Many queries do not modify the underlying relation. For such queries, if > on-access pruning occurs during the scan, we can check whether the page > has become all-visible and update the visibility map accordingly. > Previously, only vacuum and COPY FREEZE marked pages as all-visible or > all-frozen. > > This commit implements on-access VM setting for sequential scans as well > as for the underlying heap relation in index scans and bitmap heap > scans. For evaluating this, did you build anything that evaluates the frequency of this succeeding, causing unnecessary un-all-visibling etc during benchmarks? > diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c > index 1a3fa8a76aa..7d22549a290 100644 > --- a/src/backend/access/heap/heapam.c > +++ b/src/backend/access/heap/heapam.c > @@ -617,6 +617,7 @@ heap_prepare_pagescan(TableScanDesc sscan) > Buffer buffer = scan->rs_cbuf; > BlockNumber block = scan->rs_cblock; > Snapshot snapshot; > + Buffer *vmbuffer = NULL; > Page page; > int lines; > bool all_visible; > @@ -631,7 +632,9 @@ heap_prepare_pagescan(TableScanDesc sscan) > /* > * Prune and repair fragmentation for the whole page, if possible. > */ > - heap_page_prune_opt(scan->rs_base.rs_rd, buffer); > + if (sscan->rs_flags & SO_HINT_REL_READ_ONLY) > + vmbuffer = &scan->rs_vmbuffer; > + heap_page_prune_opt(scan->rs_base.rs_rd, buffer, vmbuffer); I don't love that the signalling to heap_page_prune_opt() about this is by passing vmbuffer or NULL. We clearly don't want to actually freeze rows if we're doing an update and might just update the rows again. But it's less clear to me that, if we are pruning dead row versions *and* the page is already all-visible after that (say because only HOT versions were removed), we shouldn't mark the page as such? > @@ -306,6 +312,13 @@ heap_page_prune_opt(Relation relation, Buffer buffer) > .cutoffs = NULL, > }; > > + if (vmbuffer) > + { > + visibilitymap_pin(relation, BufferGetBlockNumber(buffer), vmbuffer); > + params.options |= HEAP_PAGE_PRUNE_UPDATE_VM; > + params.vmbuffer = *vmbuffer; Why do we pin the buffer at this time, rather than deferring that until we actually need it? I guess we just always will access it, but that doesn't seem like it's inherent (c.f. my earlier points about a faster exit when looking at an already all-frozen page or such). It's not clear to me why we are pinning the page in lazy_scan_heap(), before it's clear that we need it, either. But there the cost is often very low, because we have a lot of sequential accesses. But here we might be called from an index scan, with very little locality of access. Greetings, Andres Freund