263 lines
12 KiB
C++
263 lines
12 KiB
C++
/**
|
|
* 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_SQL_OPTIMIZER_OB_OPT_EST_PARAMETER_
|
|
#define OCEANBASE_SQL_OPTIMIZER_OB_OPT_EST_PARAMETER_
|
|
#include "common/object/ob_obj_type.h"
|
|
#define DEFAULT_CPU_SPEED 2500
|
|
#define DEFAULT_DISK_SEQ_READ_SPEED 1024
|
|
#define DEFAULT_DISK_RND_READ_SPEED 512
|
|
#define DEFAULT_NETWORK_SPEED 156
|
|
#define DEFAULT_MACR_BLOCK_SIZE (16 * 1024)
|
|
|
|
namespace oceanbase
|
|
{
|
|
namespace sql
|
|
{
|
|
class OptSystemStat;
|
|
enum PROJECT_TYPE {
|
|
PROJECT_INT = 0,
|
|
PROJECT_NUMBER,
|
|
PROJECT_CHAR,
|
|
MAX_PROJECT_TYPE
|
|
};
|
|
class ObOptCostModelParameter {
|
|
public:
|
|
explicit ObOptCostModelParameter(
|
|
const double DEFAULT_CPU_TUPLE_COST,
|
|
const double DEFAULT_TABLE_SCAN_CPU_TUPLE_COST,
|
|
const double DEFAULT_MICRO_BLOCK_SEQ_COST,
|
|
const double DEFAULT_MICRO_BLOCK_RND_COST,
|
|
const double DEFAULT_FETCH_ROW_RND_COST,
|
|
const double DEFAULT_CMP_GEO_COST,
|
|
const double DEFAULT_MATERIALIZE_PER_BYTE_WRITE_COST,
|
|
const double DEFAULT_READ_MATERIALIZED_PER_ROW_COST,
|
|
const double DEFAULT_PER_AGGR_FUNC_COST,
|
|
const double DEFAULT_PER_WIN_FUNC_COST,
|
|
const double DEFAULT_CPU_OPERATOR_COST,
|
|
const double DEFAULT_JOIN_PER_ROW_COST,
|
|
const double DEFAULT_BUILD_HASH_PER_ROW_COST,
|
|
const double DEFAULT_PROBE_HASH_PER_ROW_COST,
|
|
const double DEFAULT_RESCAN_COST,
|
|
const double DEFAULT_NETWORK_SER_PER_BYTE_COST,
|
|
const double DEFAULT_NETWORK_DESER_PER_BYTE_COST,
|
|
const double DEFAULT_NETWORK_TRANS_PER_BYTE_COST,
|
|
const double DEFAULT_PX_RESCAN_PER_ROW_COST,
|
|
const double DEFAULT_PX_BATCH_RESCAN_PER_ROW_COST,
|
|
const double DEFAULT_NL_SCAN_COST,
|
|
const double DEFAULT_BATCH_NL_SCAN_COST,
|
|
const double DEFAULT_NL_GET_COST,
|
|
const double DEFAULT_BATCH_NL_GET_COST,
|
|
const double DEFAULT_TABLE_LOOPUP_PER_ROW_RPC_COST,
|
|
const double DEFAULT_INSERT_PER_ROW_COST,
|
|
const double DEFAULT_INSERT_INDEX_PER_ROW_COST,
|
|
const double DEFAULT_INSERT_CHECK_PER_ROW_COST,
|
|
const double DEFAULT_UPDATE_PER_ROW_COST,
|
|
const double DEFAULT_UPDATE_INDEX_PER_ROW_COST,
|
|
const double DEFAULT_UPDATE_CHECK_PER_ROW_COST,
|
|
const double DEFAULT_DELETE_PER_ROW_COST,
|
|
const double DEFAULT_DELETE_INDEX_PER_ROW_COST,
|
|
const double DEFAULT_DELETE_CHECK_PER_ROW_COST,
|
|
const double DEFAULT_SPATIAL_PER_ROW_COST,
|
|
const double DEFAULT_RANGE_COST,
|
|
const double DEFAULT_CMP_UDF_COST,
|
|
const double DEFAULT_CMP_LOB_COST,
|
|
const double DEFAULT_CMP_ERR_HANDLE_EXPR_COST,
|
|
const double (&comparison_params)[common::ObMaxTC + 1],
|
|
const double (&hash_params)[common::ObMaxTC + 1],
|
|
const double (&project_params)[2][2][MAX_PROJECT_TYPE]
|
|
)
|
|
: CPU_TUPLE_COST(DEFAULT_CPU_TUPLE_COST),
|
|
TABLE_SCAN_CPU_TUPLE_COST(DEFAULT_TABLE_SCAN_CPU_TUPLE_COST),
|
|
MICRO_BLOCK_SEQ_COST(DEFAULT_MICRO_BLOCK_SEQ_COST),
|
|
MICRO_BLOCK_RND_COST(DEFAULT_MICRO_BLOCK_RND_COST),
|
|
FETCH_ROW_RND_COST(DEFAULT_FETCH_ROW_RND_COST),
|
|
CMP_SPATIAL_COST(DEFAULT_CMP_GEO_COST),
|
|
MATERIALIZE_PER_BYTE_WRITE_COST(DEFAULT_MATERIALIZE_PER_BYTE_WRITE_COST),
|
|
READ_MATERIALIZED_PER_ROW_COST(DEFAULT_READ_MATERIALIZED_PER_ROW_COST),
|
|
PER_AGGR_FUNC_COST(DEFAULT_PER_AGGR_FUNC_COST),
|
|
PER_WIN_FUNC_COST(DEFAULT_PER_WIN_FUNC_COST),
|
|
CPU_OPERATOR_COST(DEFAULT_CPU_OPERATOR_COST),
|
|
JOIN_PER_ROW_COST(DEFAULT_JOIN_PER_ROW_COST),
|
|
BUILD_HASH_PER_ROW_COST(DEFAULT_BUILD_HASH_PER_ROW_COST),
|
|
PROBE_HASH_PER_ROW_COST(DEFAULT_PROBE_HASH_PER_ROW_COST),
|
|
RESCAN_COST(DEFAULT_RESCAN_COST),
|
|
NETWORK_SER_PER_BYTE_COST(DEFAULT_NETWORK_SER_PER_BYTE_COST),
|
|
NETWORK_DESER_PER_BYTE_COST(DEFAULT_NETWORK_DESER_PER_BYTE_COST),
|
|
NETWORK_TRANS_PER_BYTE_COST(DEFAULT_NETWORK_TRANS_PER_BYTE_COST),
|
|
PX_RESCAN_PER_ROW_COST(DEFAULT_PX_RESCAN_PER_ROW_COST),
|
|
PX_BATCH_RESCAN_PER_ROW_COST(DEFAULT_PX_BATCH_RESCAN_PER_ROW_COST),
|
|
NL_SCAN_COST(DEFAULT_NL_SCAN_COST),
|
|
BATCH_NL_SCAN_COST(DEFAULT_BATCH_NL_SCAN_COST),
|
|
NL_GET_COST(DEFAULT_NL_GET_COST),
|
|
BATCH_NL_GET_COST(DEFAULT_BATCH_NL_GET_COST),
|
|
TABLE_LOOPUP_PER_ROW_RPC_COST(DEFAULT_TABLE_LOOPUP_PER_ROW_RPC_COST),
|
|
INSERT_PER_ROW_COST(DEFAULT_INSERT_PER_ROW_COST),
|
|
INSERT_INDEX_PER_ROW_COST(DEFAULT_INSERT_INDEX_PER_ROW_COST),
|
|
INSERT_CHECK_PER_ROW_COST(DEFAULT_INSERT_CHECK_PER_ROW_COST),
|
|
UPDATE_PER_ROW_COST(DEFAULT_UPDATE_PER_ROW_COST),
|
|
UPDATE_INDEX_PER_ROW_COST(DEFAULT_UPDATE_INDEX_PER_ROW_COST),
|
|
UPDATE_CHECK_PER_ROW_COST(DEFAULT_UPDATE_CHECK_PER_ROW_COST),
|
|
DELETE_PER_ROW_COST(DEFAULT_DELETE_PER_ROW_COST),
|
|
DELETE_INDEX_PER_ROW_COST(DEFAULT_DELETE_INDEX_PER_ROW_COST),
|
|
DELETE_CHECK_PER_ROW_COST(DEFAULT_DELETE_CHECK_PER_ROW_COST),
|
|
SPATIAL_PER_ROW_COST(DEFAULT_SPATIAL_PER_ROW_COST),
|
|
RANGE_COST(DEFAULT_RANGE_COST),
|
|
CMP_UDF_COST(DEFAULT_CMP_UDF_COST),
|
|
CMP_LOB_COST(DEFAULT_CMP_LOB_COST),
|
|
CMP_ERR_HANDLE_EXPR_COST(DEFAULT_CMP_ERR_HANDLE_EXPR_COST),
|
|
comparison_params_(comparison_params),
|
|
hash_params_(hash_params),
|
|
project_params_(project_params)
|
|
{
|
|
}
|
|
|
|
double get_cpu_tuple_cost(const OptSystemStat& stat) const;
|
|
double get_table_scan_cpu_tuple_cost(const OptSystemStat& stat) const;
|
|
double get_micro_block_seq_cost(const OptSystemStat& stat) const;
|
|
double get_micro_block_rnd_cost(const OptSystemStat& stat) const;
|
|
double get_project_column_cost(const OptSystemStat& stat,
|
|
PROJECT_TYPE type,
|
|
bool is_rnd,
|
|
bool use_column_store) const;
|
|
double get_fetch_row_rnd_cost(const OptSystemStat& stat) const;
|
|
double get_cmp_spatial_cost(const OptSystemStat& stat) const;
|
|
double get_materialize_per_byte_write_cost(const OptSystemStat& stat) const;
|
|
double get_read_materialized_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_per_aggr_func_cost(const OptSystemStat& stat) const;
|
|
double get_per_win_func_cost(const OptSystemStat& stat) const;
|
|
double get_cpu_operator_cost(const OptSystemStat& stat) const;
|
|
double get_join_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_build_hash_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_probe_hash_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_rescan_cost(const OptSystemStat& stat) const;
|
|
double get_network_ser_per_byte_cost(const OptSystemStat& stat) const;
|
|
double get_network_deser_per_byte_cost(const OptSystemStat& stat) const;
|
|
double get_network_trans_per_byte_cost(const OptSystemStat& stat) const;
|
|
double get_px_rescan_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_px_batch_rescan_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_nl_scan_cost(const OptSystemStat& stat) const;
|
|
double get_batch_nl_scan_cost(const OptSystemStat& stat) const;
|
|
double get_nl_get_cost(const OptSystemStat& stat) const;
|
|
double get_batch_nl_get_cost(const OptSystemStat& stat) const;
|
|
double get_table_loopup_per_row_rpc_cost(const OptSystemStat& stat) const;
|
|
double get_insert_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_insert_index_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_insert_check_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_update_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_update_index_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_update_check_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_delete_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_delete_index_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_delete_check_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_spatial_per_row_cost(const OptSystemStat& stat) const;
|
|
double get_range_cost(const OptSystemStat& stat) const;
|
|
double get_comparison_cost(const OptSystemStat& stat, int64_t type) const;
|
|
double get_hash_cost(const OptSystemStat& stat, int64_t type) const;
|
|
double get_cmp_lob_cost(const OptSystemStat& stat) const;
|
|
double get_cmp_udf_cost(const OptSystemStat& stat) const;
|
|
double get_cmp_err_handle_expr_cost(const OptSystemStat& stat) const;
|
|
|
|
protected:
|
|
/** 读取一行的CPU开销,基本上只包括get_next_row()操作 */
|
|
double CPU_TUPLE_COST;
|
|
/** 存储层吐出一行的代价 **/
|
|
double TABLE_SCAN_CPU_TUPLE_COST;
|
|
/** 顺序读取一个微块并反序列化的开销 */
|
|
double MICRO_BLOCK_SEQ_COST;
|
|
/** 随机读取一个微块并反序列化的开销 */
|
|
double MICRO_BLOCK_RND_COST;
|
|
/** 随机读取中定位某一行所在位置的开销 */
|
|
double FETCH_ROW_RND_COST;
|
|
/** 比较一次空间数据的代价 */
|
|
double CMP_SPATIAL_COST;
|
|
/** 物化一个字节的代价 */
|
|
double MATERIALIZE_PER_BYTE_WRITE_COST;
|
|
/** 读取物化后的行的代价,即对物化后数据结构的get_next_row() */
|
|
double READ_MATERIALIZED_PER_ROW_COST;
|
|
/** 一次聚集函数计算的代价 */
|
|
double PER_AGGR_FUNC_COST;
|
|
/** 一次窗口函数计算的代价 */
|
|
double PER_WIN_FUNC_COST;
|
|
/** 一次操作的基本代价 */
|
|
double CPU_OPERATOR_COST;
|
|
/** 连接两表的一行的基本代价 */
|
|
double JOIN_PER_ROW_COST;
|
|
/** 构建hash table时每行的均摊代价 */
|
|
double BUILD_HASH_PER_ROW_COST;
|
|
/** 查询hash table时每行的均摊代价 */
|
|
double PROBE_HASH_PER_ROW_COST;
|
|
double RESCAN_COST;
|
|
/*network serialization cost for one byte*/
|
|
double NETWORK_SER_PER_BYTE_COST;
|
|
/*network de-serialization cost for one byte*/
|
|
double NETWORK_DESER_PER_BYTE_COST;
|
|
/** 网络传输1个字节的代价 */
|
|
double NETWORK_TRANS_PER_BYTE_COST;
|
|
/*additional px-rescan cost*/
|
|
double PX_RESCAN_PER_ROW_COST;
|
|
double PX_BATCH_RESCAN_PER_ROW_COST;
|
|
//条件下压nestloop join右表扫一次的代价
|
|
double NL_SCAN_COST;
|
|
//条件下压batch nestloop join右表扫一次的代价
|
|
double BATCH_NL_SCAN_COST;
|
|
//条件下压nestloop join右表GET一次的代价
|
|
double NL_GET_COST;
|
|
//条件下压batch nestloop join右表GET一次的代价
|
|
double BATCH_NL_GET_COST;
|
|
//table look up一行的rpc代价
|
|
double TABLE_LOOPUP_PER_ROW_RPC_COST;
|
|
//insert一行主表的代价
|
|
double INSERT_PER_ROW_COST;
|
|
//insert一行索引表的代价
|
|
double INSERT_INDEX_PER_ROW_COST;
|
|
//insert单个约束检查代价
|
|
double INSERT_CHECK_PER_ROW_COST;
|
|
//update一行主表的代价
|
|
double UPDATE_PER_ROW_COST;
|
|
//update一行索引表的代价
|
|
double UPDATE_INDEX_PER_ROW_COST;
|
|
//update单个约束检查代价
|
|
double UPDATE_CHECK_PER_ROW_COST;
|
|
//delete一行主表的代价
|
|
double DELETE_PER_ROW_COST;
|
|
//delete一行索引表的代价
|
|
double DELETE_INDEX_PER_ROW_COST;
|
|
//delete单个约束检查代价
|
|
double DELETE_CHECK_PER_ROW_COST;
|
|
//空间索引扫描的线性参数
|
|
double SPATIAL_PER_ROW_COST;
|
|
//存储层切换一次range的代价
|
|
double RANGE_COST;
|
|
//计算一个UDF的代价
|
|
double CMP_UDF_COST;
|
|
//计算一个返回值为LOB的表达式的代价
|
|
double CMP_LOB_COST;
|
|
//计算一个需处理异常的表达式的代价
|
|
double CMP_ERR_HANDLE_EXPR_COST;
|
|
|
|
const double (&comparison_params_)[common::ObMaxTC + 1];
|
|
const double (&hash_params_)[common::ObMaxTC + 1]; /*
|
|
* +-sequence access project
|
|
* +-row store----+
|
|
* | +-random access project
|
|
* project cost-+
|
|
* | +-sequence access project
|
|
* +-column store-+
|
|
* +-random access project
|
|
*/
|
|
const double (&project_params_)[2][2][MAX_PROJECT_TYPE];
|
|
};
|
|
|
|
}
|
|
}
|
|
#endif /*OCEANBASE_SQL_OPTIMIZER_OB_OPT_EST_PARAMETER_*/ |