• Evgeny Potemkin's avatar
    Bug#34384: Slow down on constant conversion. · c81e2345
    Evgeny Potemkin authored
    When values of different types are compared they're converted to a type that
    allows correct comparison. This conversion is done for each comparison and
    takes some time. When a constant is being compared it's possible to cache the
    value after conversion to speedup comparison. In some cases (large dataset,
    complex WHERE condition with many type conversions) query might be executed
    7% faster.
    
    A test case isn't provided because all changes are internal and isn't visible
    outside.
    
    The behavior of the Item_cache is changed to cache values on the first request
    of cached value rather than at the moment of storing item to be cached.
    A flag named value_cached is added to the Item_cache class. It's set to TRUE
    when cache holds the value of the last stored item.
    Function named cache_value() is added to the Item_cache class and derived classes.
    This function actually caches the value of the saved item.
    Item_cache_xxx::store functions now only store item to be cached and set
    value_cached flag to FALSE.
    Item_cache_xxx::val_xxx functions are changed to call cache_value function
    prior to returning cached value if value_cached is FALSE.
    The Arg_comparator::set_cmp_func function now calls cache_converted_constant
    to cache constants if they need a type conversion.
    The Item_cache::get_cache function is overloaded to allow setting of the
    cache type.
    The cache_converted_constant function is added to the Arg_comparator class.
    It checks whether a value can and should be cached and if so caches it.
    
    sql/item.cc:
      Bug#34384: Slow down on constant conversion.
      Function named cache_value() is added to the Item_cache class and derived classes.
      This function actually caches the value of the saved item.
      Item_cache_xxx::store functions now only store item to be cached and set
      value_cached flag to FALSE.
      Item_cache_xxx::val_xxx functions are changed to call cache_value function
      prior to returning cached value if value_cached is FALSE.
      The Item_cache::get_cache function is overloaded to allow setting of the
      cache type.
    sql/item.h:
      Bug#34384: Slow down on constant conversion.
      A flag named value_cached is added to the Item_cache class. It's set to TRUE
      when we need to start caching values when the store method is called.
      Function named cache_value() is added to the Item_cache class and derived classes.
    sql/item_cmpfunc.cc:
      Bug#34384: Slow down on constant conversion.
      A helper function cache_converted_constant is added to the Arg_comparator class.
      It checks whether a given item can and should be cached and caches it if so.
      The Arg_comparator::set_cmp_func function now calls cache_converted_constant
      to cache constants if they need a type conversion.
    sql/item_cmpfunc.h:
      Bug#34384: Slow down on constant conversion.
      The cache_converted_constant function is added to the Arg_comparator class.
      It checks whether a value can and should be cached and if so caches it.
    sql/item_subselect.cc:
      Bug#34384: Slow down on constant conversion.
      Force immediate caching of subselect result.
    sql/item_xmlfunc.cc:
      Bug#34384: Slow down on constant conversion.
    sql/sp_rcontext.cc:
      Bug#34384: Slow down on constant conversion.
      Force immediate caching of values of an SP CASE function.
    c81e2345
item_cmpfunc.h 52 KB