• Michael Paquier's avatar
    Add support for partitioned tables and indexes in REINDEX · a6642b3a
    Michael Paquier authored
    Until now, REINDEX was not able to work with partitioned tables and
    indexes, forcing users to reindex partitions one by one.  This extends
    REINDEX INDEX and REINDEX TABLE so as they can accept a partitioned
    index and table in input, respectively, to reindex all the partitions
    assigned to them with physical storage (foreign tables, partitioned
    tables and indexes are then discarded).
    
    This shares some logic with schema and database REINDEX as each
    partition gets processed in its own transaction after building a list of
    relations to work on.  This choice has the advantage to minimize the
    number of invalid indexes to one partition with REINDEX CONCURRENTLY in
    the event a cancellation or failure in-flight, as the only indexes
    handled at once in a single REINDEX CONCURRENTLY loop are the ones from
    the partition being working on.
    
    Isolation tests are added to emulate some cases I bumped into while
    developing this feature, particularly with the concurrent drop of a
    leaf partition reindexed.  However, this is rather limited as LOCK would
    cause REINDEX to block in the first transaction building the list of
    partitions.
    
    Per its multi-transaction nature, this new flavor cannot run in a
    transaction block, similarly to REINDEX SCHEMA, SYSTEM and DATABASE.
    
    Author: Justin Pryzby, Michael Paquier
    Reviewed-by: Anastasia Lubennikova
    Discussion: https://postgr.es/m/db12e897-73ff-467e-94cb-4af03705435f.adger.lj@alibaba-inc.com
    a6642b3a
reindex-partitions.spec 2.42 KB