Re: 11.7. Indexes on Expressions - Mailing list pgsql-docs

From Bruce Momjian
Subject Re: 11.7. Indexes on Expressions
Date
Msg-id 20211217214343.GC5592@momjian.us
Whole thread Raw
In response to Re: 11.7. Indexes on Expressions  (Chris Lowder <clowder@hey.com>)
List 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@momjian.us>        https://momjian.us
  EDB                                      https://enterprisedb.com

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


Attachment

pgsql-docs by date:

Previous
From: Chris Lowder
Date:
Subject: Re: 11.7. Indexes on Expressions
Next
From: PG Doc comments form
Date:
Subject: One of the example queries that 'could' is identical to one that 'could not'.