Re: 11.7. Indexes on Expressions
| От | Bruce Momjian |
|---|---|
| Тема | Re: 11.7. Indexes on Expressions |
| Дата | |
| Msg-id | 20211217214343.GC5592@momjian.us обсуждение исходный текст |
| Ответ на | Re: 11.7. Indexes on Expressions (Chris Lowder <clowder@hey.com>) |
| Список | 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.
Вложения
В списке pgsql-docs по дате отправления: