• Robert Haas's avatar
    Be lazier about partition tuple routing. · edd44738
    Robert Haas authored
    It's not necessary to fully initialize the executor data structures
    for partitions to which no tuples are ever routed.  Consider, for
    example, an INSERT statement that inserts only one row: it only cares
    about the partition to which that one row is routed.  The new function
    ExecInitPartitionInfo performs the initialization in question only
    when a particular partition is about to receive a tuple. This includes
    creating, validating, and saving a pointer to the ResultRelInfo,
    setting up for speculative insertions, translating WCOs and
    initializing the resulting expressions, translating returning lists
    and building the appropriate projection information, and setting up a
    tuple conversion map.
    
    One thing that's not deferred is locking the child partitions; that
    seems desirable but would need more thought.  Still, testing shows
    that this makes single-row inserts significantly faster on a table
    with many partitions without harming the bulk-insert case.
    
    Amit Langote, reviewed by Etsuro Fujita, with a few changes by me
    
    Discussion: http://postgr.es/m/8975331d-d961-cbdd-f862-fdd3d97dc2d0@lab.ntt.co.jp
    edd44738
execPartition.h 5.04 KB