• David Rowley's avatar
    Speedup ScalarArrayOpExpr evaluation · 50e17ad2
    David Rowley authored
    ScalarArrayOpExprs with "useOr=true" and a set of Consts on the righthand
    side have traditionally been evaluated by using a linear search over the
    array.  When these arrays contain large numbers of elements then this
    linear search could become a significant part of execution time.
    
    Here we add a new method of evaluating ScalarArrayOpExpr expressions to
    allow them to be evaluated by first building a hash table containing each
    element, then on subsequent evaluations, we just probe that hash table to
    determine if there is a match.
    
    The planner is in charge of determining when this optimization is possible
    and it enables it by setting hashfuncid in the ScalarArrayOpExpr.  The
    executor will only perform the hash table evaluation when the hashfuncid
    is set.
    
    This means that not all cases are optimized. For example CHECK constraints
    containing an IN clause won't go through the planner, so won't get the
    hashfuncid set.  We could maybe do something about that at some later
    date.  The reason we're not doing it now is from fear that we may slow
    down cases where the expression is evaluated only once.  Those cases can
    be common, for example, a single row INSERT to a table with a CHECK
    constraint containing an IN clause.
    
    In the planner, we enable this when there are suitable hash functions for
    the ScalarArrayOpExpr's operator and only when there is at least
    MIN_ARRAY_SIZE_FOR_HASHED_SAOP elements in the array.  The threshold is
    currently set to 9.
    
    Author: James Coleman, David Rowley
    Reviewed-by: David Rowley, Tomas Vondra, Heikki Linnakangas
    Discussion: https://postgr.es/m/CAAaqYe8x62+=wn0zvNKCj55tPpg-JBHzhZFFc6ANovdqFw7-dA@mail.gmail.com
    50e17ad2
readfuncs.c 62.7 KB