Batchsize auto downgrade for lob/longtext/mediumtext type
This commit is contained in:
@ -100,7 +100,8 @@ int ObStaticEngineExprCG::detect_batch_size(const ObRawExprUniqueSet &exprs,
|
|||||||
int64_t MAX_ROWSIZE = 65535;
|
int64_t MAX_ROWSIZE = 65535;
|
||||||
int64_t MIN_ROWSIZE = 2;
|
int64_t MIN_ROWSIZE = 2;
|
||||||
const common::ObIArray<ObRawExpr *> &raw_exprs = exprs.get_expr_array();
|
const common::ObIArray<ObRawExpr *> &raw_exprs = exprs.get_expr_array();
|
||||||
if (can_execute_vectorizely(raw_exprs)) {
|
auto size = get_expr_execute_size(raw_exprs);
|
||||||
|
if (size == ObExprBatchSize::full) {
|
||||||
if (config_maxrows) {
|
if (config_maxrows) {
|
||||||
batch_size = config_maxrows;
|
batch_size = config_maxrows;
|
||||||
for (int64_t i = 0; OB_SUCC(ret) && i < raw_exprs.count(); i++) {
|
for (int64_t i = 0; OB_SUCC(ret) && i < raw_exprs.count(); i++) {
|
||||||
@ -141,8 +142,10 @@ int ObStaticEngineExprCG::detect_batch_size(const ObRawExprUniqueSet &exprs,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (size == ObExprBatchSize::small) {
|
||||||
|
batch_size = static_cast<int64_t>(ObExprBatchSize::small); //
|
||||||
} else {
|
} else {
|
||||||
batch_size = 1;
|
batch_size = static_cast<int64_t>(ObExprBatchSize::one);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -1391,28 +1394,30 @@ int ObStaticEngineExprCG::get_vectorized_exprs(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ObStaticEngineExprCG::can_execute_vectorizely(
|
ObStaticEngineExprCG::ObExprBatchSize ObStaticEngineExprCG::get_expr_execute_size(
|
||||||
const common::ObIArray<ObRawExpr *> &raw_exprs)
|
const common::ObIArray<ObRawExpr *> &raw_exprs)
|
||||||
{
|
{
|
||||||
bool can_exprs_execute_vectorizely = true;
|
ObExprBatchSize size = ObExprBatchSize::full;
|
||||||
bool has_udf_expr = false;
|
bool has_udf_expr = false;
|
||||||
bool has_usr_var_expr = false;
|
bool has_usr_var_expr = false;
|
||||||
bool has_wrapper_inner_expr = false;
|
bool has_wrapper_inner_expr = false;
|
||||||
for (int64_t i = 0; (can_exprs_execute_vectorizely) && i < raw_exprs.count();
|
for (int64_t i = 0; i < raw_exprs.count(); i++) {
|
||||||
i++) {
|
|
||||||
ObItemType type = raw_exprs.at(i)->get_expr_type();
|
ObItemType type = raw_exprs.at(i)->get_expr_type();
|
||||||
if (T_OP_GET_USER_VAR == type) {
|
if (T_OP_GET_USER_VAR == type) {
|
||||||
has_usr_var_expr = true;
|
has_usr_var_expr = true;
|
||||||
} else if (T_FUN_UDF == type) {
|
} else if (T_FUN_UDF == type) {
|
||||||
has_udf_expr = true;
|
has_udf_expr = true;
|
||||||
if (!(static_cast<ObUDFRawExpr*>(raw_exprs.at(i))->is_deterministic())) {
|
if (!(static_cast<ObUDFRawExpr*>(raw_exprs.at(i))->is_deterministic())) {
|
||||||
can_exprs_execute_vectorizely = false;
|
size = ObExprBatchSize::one;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else if (T_FUN_SYS_WRAPPER_INNER == type) {
|
} else if (T_FUN_SYS_WRAPPER_INNER == type) {
|
||||||
can_exprs_execute_vectorizely = false;
|
size = ObExprBatchSize::one;
|
||||||
|
break;
|
||||||
} else if (T_REF_QUERY == type) {
|
} else if (T_REF_QUERY == type) {
|
||||||
if (static_cast<ObQueryRefRawExpr*>(raw_exprs.at(i))->is_cursor()) {
|
if (static_cast<ObQueryRefRawExpr*>(raw_exprs.at(i))->is_cursor()) {
|
||||||
can_exprs_execute_vectorizely = false;
|
size = ObExprBatchSize::one;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LOG_DEBUG("check expr type", K(type), KPC(raw_exprs.at(i)));
|
LOG_DEBUG("check expr type", K(type), KPC(raw_exprs.at(i)));
|
||||||
@ -1436,13 +1441,19 @@ bool ObStaticEngineExprCG::can_execute_vectorizely(
|
|||||||
//
|
//
|
||||||
// Execute UDF f1() vectorizely would set @b='abc' within a batch and leave
|
// Execute UDF f1() vectorizely would set @b='abc' within a batch and leave
|
||||||
// NO chance to disaply @b=1
|
// NO chance to disaply @b=1
|
||||||
if (can_exprs_execute_vectorizely) {
|
if (has_udf_expr & has_usr_var_expr) {
|
||||||
can_exprs_execute_vectorizely = !(has_udf_expr & has_usr_var_expr);
|
size = ObExprBatchSize::one;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
if (is_large_data(raw_exprs.at(i)->get_data_type())) {
|
||||||
|
// 1. batchsize should be scale down when longtext/mediumtext/lob shows up
|
||||||
|
// 2. keep searching
|
||||||
|
size = ObExprBatchSize::small;
|
||||||
}
|
}
|
||||||
LOG_TRACE("can_execute_vectorizely",
|
|
||||||
K(can_exprs_execute_vectorizely));
|
}
|
||||||
return can_exprs_execute_vectorizely;
|
LOG_TRACE("can_execute_vectorizely", K(size));
|
||||||
|
return size;
|
||||||
}
|
}
|
||||||
int ObStaticEngineExprCG::divide_probably_local_exprs(common::ObIArray<ObRawExpr *> &exprs)
|
int ObStaticEngineExprCG::divide_probably_local_exprs(common::ObIArray<ObRawExpr *> &exprs)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -383,9 +383,23 @@ private:
|
|||||||
bool is_vectorized_expr(const ObRawExpr *raw_expr) const;
|
bool is_vectorized_expr(const ObRawExpr *raw_expr) const;
|
||||||
int compute_max_batch_size(const ObRawExpr *raw_expr);
|
int compute_max_batch_size(const ObRawExpr *raw_expr);
|
||||||
|
|
||||||
|
enum class ObExprBatchSize {
|
||||||
|
one = 1,
|
||||||
|
small = 8,
|
||||||
|
full = 65535
|
||||||
|
};
|
||||||
// Certain exprs can NOT be executed vectorizely. Check the exps within this
|
// Certain exprs can NOT be executed vectorizely. Check the exps within this
|
||||||
// routine
|
// routine
|
||||||
bool can_execute_vectorizely(const common::ObIArray<ObRawExpr *> &raw_exprs);
|
ObExprBatchSize
|
||||||
|
get_expr_execute_size(const common::ObIArray<ObRawExpr *> &raw_exprs);
|
||||||
|
inline bool is_large_data(ObObjType type) {
|
||||||
|
bool b_large_data = false;
|
||||||
|
if (type == ObLongTextType || type == ObMediumTextType ||
|
||||||
|
type == ObLobType) {
|
||||||
|
b_large_data = true;
|
||||||
|
}
|
||||||
|
return b_large_data;
|
||||||
|
}
|
||||||
|
|
||||||
// get the frame idx of param frames and datum index (in frame) by index of param store.
|
// get the frame idx of param frames and datum index (in frame) by index of param store.
|
||||||
void get_param_frame_idx(const int64_t idx, int64_t &frame_idx, int64_t &datum_idx);
|
void get_param_frame_idx(const int64_t idx, int64_t &frame_idx, int64_t &datum_idx);
|
||||||
|
|||||||
Reference in New Issue
Block a user