• Tomas Vondra's avatar
    Implement Incremental Sort · d2d8a229
    Tomas Vondra authored
    Incremental Sort is an optimized variant of multikey sort for cases when
    the input is already sorted by a prefix of the requested sort keys. For
    example when the relation is already sorted by (key1, key2) and we need
    to sort it by (key1, key2, key3) we can simply split the input rows into
    groups having equal values in (key1, key2), and only sort/compare the
    remaining column key3.
    
    This has a number of benefits:
    
    - Reduced memory consumption, because only a single group (determined by
      values in the sorted prefix) needs to be kept in memory. This may also
      eliminate the need to spill to disk.
    
    - Lower startup cost, because Incremental Sort produce results after each
      prefix group, which is beneficial for plans where startup cost matters
      (like for example queries with LIMIT clause).
    
    We consider both Sort and Incremental Sort, and decide based on costing.
    
    The implemented algorithm operates in two different modes:
    
    - Fetching a minimum number of tuples without check of equality on the
      prefix keys, and sorting on all columns when safe.
    
    - Fetching all tuples for a single prefix group and then sorting by
      comparing only the remaining (non-prefix) keys.
    
    We always start in the first mode, and employ a heuristic to switch into
    the second mode if we believe it's beneficial - the goal is to minimize
    the number of unnecessary comparions while keeping memory consumption
    below work_mem.
    
    This is a very old patch series. The idea was originally proposed by
    Alexander Korotkov back in 2013, and then revived in 2017. In 2018 the
    patch was taken over by James Coleman, who wrote and rewrote most of the
    current code.
    
    There were many reviewers/contributors since 2013 - I've done my best to
    pick the most active ones, and listed them in this commit message.
    
    Author: James Coleman, Alexander Korotkov
    Reviewed-by: Tomas Vondra, Andreas Karlsson, Marti Raudsepp, Peter Geoghegan, Robert Haas, Thomas Munro, Antonin Houska, Andres Freund, Alexander Kuzmenkov
    Discussion: https://postgr.es/m/CAPpHfdscOX5an71nHd8WSUH6GNOCf=V7wgDaTXdDd9=goN-gfA@mail.gmail.com
    Discussion: https://postgr.es/m/CAPpHfds1waRZ=NOmueYq0sx1ZSCnt+5QJvizT8ndT2=etZEeAQ@mail.gmail.com
    d2d8a229
config.sgml 445 KB