/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. */ #ifndef OCEANBASE_SRC_SQL_ENGINE_ADAPTIVE_BYPASS_CTRL_H_ #define OCEANBASE_SRC_SQL_ENGINE_ADAPTIVE_BYPASS_CTRL_H_ #include "sql/engine/ob_operator.h" #include "lib/utility/ob_tracepoint.h" namespace oceanbase { namespace sql { const int64_t INIT_L2_CACHE_SIZE = get_level2_cache_size(); const int64_t INIT_L3_CACHE_SIZE = get_level3_cache_size(); const int64_t MAX_L3_CACHE_SIZE = 50 *1024 *1024; //50M const uint64_t FORCE_GPD = 0x100; const int64_t MAX_REBUILD_TIMES = 5; constexpr const double MIN_RATIO_FOR_L3 = 0.95; const int64_t DISTINCT_ITEM_SIZE = 24; const int64_t GROUP_BY_ITEM_SIZE = 40; class ObAdaptiveByPassCtrl { public: typedef enum { STATE_L2_INSERT = 0, STATE_L3_INSERT, STATE_PROBE, STATE_ANALYZE, STATE_PROCESS_HT, } ByPassState; static const int64_t MIN_PERIOD_CNT = 1000; static const uint64_t INIT_CUT_RATIO = 3; ObAdaptiveByPassCtrl () : by_pass_(false), processed_cnt_(0), state_(STATE_L2_INSERT), period_cnt_(MIN_PERIOD_CNT), probe_cnt_(0), exists_cnt_(0), rebuild_times_(0), cut_ratio_(INIT_CUT_RATIO), by_pass_ctrl_enabled_(false), small_row_cnt_(0), op_id_(-1), need_resize_hash_table_(false) {} inline void reset() { by_pass_ = false; processed_cnt_ = 0; reset_state(); period_cnt_ = MIN_PERIOD_CNT; probe_cnt_ = 0; exists_cnt_ = 0; rebuild_times_ = 0; need_resize_hash_table_ = false; } inline void reset_state() { state_ = STATE_L2_INSERT; } inline void start_process_ht() { state_ = STATE_PROCESS_HT; } inline bool processing_ht() { return STATE_PROCESS_HT == state_; } inline bool in_l2_cache(int64_t row_cnt, int64_t mem_size) { return 0 != small_row_cnt_ ? (row_cnt < small_row_cnt_) : (mem_size < INIT_L2_CACHE_SIZE); } inline bool in_l3_cache(int64_t row_cnt, int64_t mem_size) { return 0 != small_row_cnt_ ? (row_cnt < small_row_cnt_) : (mem_size < INIT_L3_CACHE_SIZE); } void gby_process_state(int64_t probe_cnt, int64_t row_cnt, int64_t mem_size); inline void inc_processed_cnt(int64_t new_processed_cnt) { processed_cnt_ += new_processed_cnt; } inline void inc_probe_cnt_() { ++probe_cnt_; } inline void inc_rebuild_times() { ++rebuild_times_; } inline void inc_exists_cnt() { ++exists_cnt_; } inline void set_cut_ratio(uint64_t cut_ratio) { cut_ratio_ = cut_ratio; } inline bool by_passing() { return by_pass_; } inline void start_by_pass() { by_pass_ = true; } inline void reset_rebuild_times() { rebuild_times_ = 0; } inline bool rebuild_times_exceeded() { return rebuild_times_ > MAX_REBUILD_TIMES; } inline void set_max_rebuild_times() { rebuild_times_ = MAX_REBUILD_TIMES + 1; } inline void open_by_pass_ctrl() { by_pass_ctrl_enabled_ = true; } inline void set_op_id(int64_t op_id) { op_id_ = op_id; } inline void set_small_row_cnt(int64_t row_cnt) { small_row_cnt_ = row_cnt; } inline int64_t get_small_row_cnt() const { return small_row_cnt_; } bool by_pass_; int64_t processed_cnt_; ByPassState state_; int64_t period_cnt_; int64_t probe_cnt_; int64_t exists_cnt_; int64_t rebuild_times_; uint64_t cut_ratio_; bool by_pass_ctrl_enabled_; int64_t small_row_cnt_; // 0 will be omit int64_t op_id_; bool need_resize_hash_table_; }; } // end namespace sql } // end namespace oceanbase #endif /* OCEANBASE_SRC_SQL_ENGINE_ADAPTIVE_BYPASS_CTRL_H_ */