I have looked more into it and have found that VACUUM FULL (and CLUSTER)
does in fact rebuild indexes, see for example:
https://github.com/postgres/postgres/blob/c8e1ba736b2b9e8c98d37a5b77c4ed31baf94147/src/backend/commands/cluster.c#L1463
I have also run some tests and have come to understand that REINDEX
seems to "vacuum" the index in the sense that a subsequent VACUUM on the
underlying table will not find any removable entries in the index.
Ron is right, the term "vacuum" may be misleading.
2023. 01. 04. 16:34 keltezéssel, Ron írta:
> I don't think VACUUM FULL (copy the table, create new indices and
> other metadata all in one command) actually vacuums tables. It's a
> misleading name.
>
> Something like REBUILD TABLE would be a better name.
>
> On 1/4/23 07:25, Rébeli-Szabó Tamás wrote:
>> Here is my understanding:
>>
>> REINDEX recreates the index from scratch, using the data stored in
>> the underlying table. It is the same as dropping and recreating the
>> index manually, with regard to the impact on the index file. It can
>> free up physical space in the file system. REINDEX will not vacuum
>> the index.
>>
>> VACUUM does many different things. One of them is vacuuming indexes
>> (for the underlying table that is being vacuumed). VACUUM will remove
>> index entries that are pointing to dead rows in the underlying table.
>> VACUUM will not rebuild the entire index.
>>
>> VACUUM recycles free index blocks (using FSM), but it does not
>> (usually) free up space for the file system physically. VACUUM FULL
>> does that.
>>
>> VACUUM FULL will vacuum the index, but it will do it by making a copy
>> of the index (file) and reorganizing its content in order to free up
>> space physically. In that regard, it is like REINDEX. Both VACUUM
>> FULL and REINDEX will block reads from the index during the process
>> (by taking an ACCESS EXCLUSIVE lock).
>>
>> Regards,
>>
>> tamas
>>
>> 2022. 12. 31. 22:04 keltezéssel, Hao Zhang írta:
>>> What is the difference between reindex and vacuum's impact on index
>>> file? I deleted an indexed row. Running either vacuum or reindex
>>> shows the index entry for the row is removed from the index page. I
>>> was under the impression that only reindex will remove dangling
>>> index entries. I am guessing that vacuum will not shrink the index
>>> file and will only add deleted index entries in the free space file
>>> for the index? But REINDEX is recreating the index file from scratch
>>> so it is like vacuum full for index?
>>>
>>> Thanks
>>
>>
>