Do not report ERROR when sample rate equals 100
This commit is contained in:
@ -30,20 +30,15 @@ struct ObExprSelPair;
|
||||
struct JoinFilterInfo;
|
||||
class OptTableMetas;
|
||||
class OptSelectivityCtx;
|
||||
class ObOptCostModelParameter;
|
||||
class OptSystemStat;
|
||||
|
||||
enum RowCountEstMethod { INVALID_METHOD = 0 }; // deprecated
|
||||
enum ObBaseTableEstBasicMethod
|
||||
enum RowCountEstMethod
|
||||
{
|
||||
EST_INVALID = 0,
|
||||
EST_DEFAULT = 1 << 0,
|
||||
EST_STAT = 1 << 1,
|
||||
EST_STORAGE = 1 << 2,
|
||||
EST_DS_BASIC = 1 << 3,
|
||||
EST_DS_FULL = 1 << 4,
|
||||
INVALID_METHOD = 0,
|
||||
DEFAULT_STAT,
|
||||
BASIC_STAT, //use min/max/ndv to estimate row count
|
||||
STORAGE_STAT, //use storage layer to estimate row count
|
||||
DYNAMIC_SAMPLING_STAT //use dynamic sampling to estimate row count
|
||||
};
|
||||
typedef uint64_t ObBaseTableEstMethod;
|
||||
|
||||
// all the table meta info need to compute cost
|
||||
struct ObTableMetaInfo
|
||||
@ -219,7 +214,7 @@ struct ObCostTableScanInfo
|
||||
table_filters_(),
|
||||
table_metas_(NULL),
|
||||
sel_ctx_(NULL),
|
||||
est_method_(EST_INVALID),
|
||||
row_est_method_(RowCountEstMethod::INVALID_METHOD),
|
||||
prefix_filter_sel_(1.0),
|
||||
pushdown_prefix_filter_sel_(1.0),
|
||||
postfix_filter_sel_(1.0),
|
||||
@ -232,9 +227,7 @@ struct ObCostTableScanInfo
|
||||
index_back_row_count_(0.0),
|
||||
output_row_count_(0.0),
|
||||
batch_type_(common::ObSimpleBatch::ObBatchType::T_NONE),
|
||||
use_column_store_(false),
|
||||
at_most_one_range_(false),
|
||||
index_back_with_column_store_(false)
|
||||
use_column_store_(false)
|
||||
{ }
|
||||
virtual ~ObCostTableScanInfo()
|
||||
{ }
|
||||
@ -245,14 +238,12 @@ struct ObCostTableScanInfo
|
||||
K_(table_meta_info), K_(index_meta_info),
|
||||
K_(access_column_items),
|
||||
K_(is_virtual_table), K_(is_unique),
|
||||
K_(is_inner_path), K_(can_use_batch_nlj), K_(est_method),
|
||||
K_(is_inner_path), K_(can_use_batch_nlj),
|
||||
K_(prefix_filter_sel), K_(pushdown_prefix_filter_sel),
|
||||
K_(postfix_filter_sel), K_(table_filter_sel),
|
||||
K_(ss_prefix_ndv), K_(ss_postfix_range_filters_sel),
|
||||
K_(use_column_store),
|
||||
K_(index_back_with_column_store),
|
||||
K_(index_scan_column_group_infos),
|
||||
K_(index_back_column_group_infos));
|
||||
K_(column_group_infos));
|
||||
// the following information need to be set before estimating cost
|
||||
uint64_t table_id_; // table id
|
||||
uint64_t ref_table_id_; // ref table id
|
||||
@ -281,7 +272,7 @@ struct ObCostTableScanInfo
|
||||
OptTableMetas *table_metas_;
|
||||
OptSelectivityCtx *sel_ctx_;
|
||||
// the following information are useful when estimating cost
|
||||
ObBaseTableEstMethod est_method_;
|
||||
RowCountEstMethod row_est_method_; // row_est_method
|
||||
double prefix_filter_sel_;
|
||||
double pushdown_prefix_filter_sel_;
|
||||
double postfix_filter_sel_;
|
||||
@ -296,10 +287,7 @@ struct ObCostTableScanInfo
|
||||
common::ObSimpleBatch::ObBatchType batch_type_;
|
||||
SampleInfo sample_info_;
|
||||
bool use_column_store_;
|
||||
bool at_most_one_range_;
|
||||
bool index_back_with_column_store_;
|
||||
common::ObSEArray<ObCostColumnGroupInfo, 4, common::ModulePageAllocator, true> index_scan_column_group_infos_;
|
||||
common::ObSEArray<ObCostColumnGroupInfo, 4, common::ModulePageAllocator, true> index_back_column_group_infos_;
|
||||
common::ObSEArray<ObCostColumnGroupInfo, 4, common::ModulePageAllocator, true> column_group_infos_;
|
||||
|
||||
private:
|
||||
DISALLOW_COPY_AND_ASSIGN(ObCostTableScanInfo);
|
||||
@ -645,11 +633,171 @@ public:
|
||||
const static int64_t DEFAULT_LOCAL_ORDER_DEGREE;
|
||||
const static int64_t DEFAULT_MAX_STRING_WIDTH;
|
||||
const static int64_t DEFAULT_FIXED_OBJ_WIDTH;
|
||||
enum PROJECT_TYPE {
|
||||
PROJECT_INT = 0,
|
||||
PROJECT_NUMBER,
|
||||
PROJECT_CHAR,
|
||||
MAX_PROJECT_TYPE
|
||||
};
|
||||
|
||||
ObOptEstCostModel(const ObOptCostModelParameter &cost_params,
|
||||
const OptSystemStat &stat)
|
||||
:cost_params_(cost_params),
|
||||
sys_stat_(stat)
|
||||
struct ObCostParams
|
||||
{
|
||||
explicit ObCostParams(
|
||||
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
|
||||
)
|
||||
: 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)
|
||||
{}
|
||||
/** 读取一行的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;
|
||||
};
|
||||
|
||||
ObOptEstCostModel(
|
||||
const double (&comparison_params)[common::ObMaxTC + 1],
|
||||
const double (&hash_params)[common::ObMaxTC + 1],
|
||||
const double (&project_params)[2][2][MAX_PROJECT_TYPE],
|
||||
const ObCostParams &cost_params)
|
||||
:comparison_params_(comparison_params),
|
||||
hash_params_(hash_params),
|
||||
project_params_(project_params),
|
||||
cost_params_(cost_params)
|
||||
{}
|
||||
|
||||
virtual ~ObOptEstCostModel()=default;
|
||||
@ -814,10 +962,6 @@ protected:
|
||||
const ObIArray<ObRawExpr *> &order_exprs,
|
||||
const ObIArray<ObExprResType> &order_col_types,
|
||||
double &cost);
|
||||
int cost_part_topn_sort(const ObSortCostInfo &cost_info,
|
||||
const ObIArray<ObRawExpr *> &order_exprs,
|
||||
const ObIArray<ObExprResType> &order_col_types,
|
||||
double &cost);
|
||||
|
||||
int cost_prefix_sort(const ObSortCostInfo &cost_info,
|
||||
const ObIArray<ObRawExpr *> &order_exprs,
|
||||
@ -851,32 +995,21 @@ protected:
|
||||
const double part_cnt_per_dop,
|
||||
double &cost);
|
||||
|
||||
int cost_row_store_basic_table(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &cost);
|
||||
|
||||
int cost_column_store_basic_table(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &cost);
|
||||
|
||||
int cost_index_scan(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &prefix_filter_sel,
|
||||
double &cost);
|
||||
|
||||
int cost_index_back(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &prefix_filter_sel,
|
||||
double &cost);
|
||||
|
||||
int cost_column_store_index_scan(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &prefix_filter_sel,
|
||||
double &cost);
|
||||
|
||||
int cost_column_store_index_back(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &prefix_filter_sel,
|
||||
double &cost);
|
||||
int cost_row_store_index_scan(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &cost);
|
||||
|
||||
int cost_row_store_index_back(const ObCostTableScanInfo &est_cost_info,
|
||||
double row_count,
|
||||
double &cost);
|
||||
// estimate the network transform and rpc cost for global index
|
||||
int cost_global_index_back_with_rp(double row_count,
|
||||
const ObCostTableScanInfo &est_cost_info,
|
||||
@ -907,10 +1040,20 @@ protected:
|
||||
double row_count,
|
||||
bool is_get,
|
||||
double &cost);
|
||||
|
||||
protected:
|
||||
const ObOptCostModelParameter &cost_params_;
|
||||
const OptSystemStat &sys_stat_;
|
||||
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];
|
||||
const ObCostParams &cost_params_;
|
||||
DISALLOW_COPY_AND_ASSIGN(ObOptEstCostModel);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user