Re: 11.7. Indexes on Expressions

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: Chris Lowder <clowder(at)hey(dot)com>
Cc: pgsql-docs(at)lists(dot)postgresql(dot)org
Subject: Re: 11.7. Indexes on Expressions
Date: 2021-12-17 21:43:43
Message-ID: 20211217214343.GC5592@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-docs

On Fri, Dec 17, 2021 at 09:41:32AM +0000, Chris Lowder wrote:
> Thank you for that (speedy) explanation and patch Bruce! That all makes perfect
> sense. 

There are actually two questions being addressed here:

1. In what cases are new index entries added, and for which indexes?
2. In what cases are index expressions evaluated?

For 1, I explained that for updates we either add new rows for all
indexes, or none of them. We create new index rows for non-HOT updates,
which happens if the updated row does not change indexed columns (or
columns involved in index expressions), and if the new row fits on the
same 8k heap page.

What I recently learned, at least for PG 10-14, is that the index
expression is only called for non-HOT updates, not HOT ones. Postgres
does not evaluate the index expression to determine if the indexed
expression has changed, but rather relies on column value comparisons.

I wrote the attached script which creates an expression index function
with a pg_sleep(1) call to determine if the function is called. If you
run the attached SQL script in psql, you will see that times of ~1
second happens only when there is a change in the colummn referenced by
the index expression or when the new row is stored on a new heap page
(ctid page number changes). The expression index function is not called
if the indexed column value does not change and remains on the same heap
page.

I am attaching an updated patch which mentions non-HOT updates for
expression indexes.

--
Bruce Momjian <bruce(at)momjian(dot)us> https://momjian.us
EDB https://enterprisedb.com

If only the physical world exists, free will is an illusion.

Attachment Content-Type Size
expr.sql application/x-sql 1.9 KB
expression.diff text/x-diff 837 bytes

In response to

Responses

Browse pgsql-docs by date

  From Date Subject
Next Message PG Doc comments form 2021-12-19 12:22:34 One of the example queries that 'could' is identical to one that 'could not'.
Previous Message Chris Lowder 2021-12-17 09:41:32 Re: 11.7. Indexes on Expressions