Batchsize auto downgrade for lob/longtext/mediumtext type

This commit is contained in:
obdev
2023-04-26 14:20:52 +00:00
committed by ob-robot
parent c0406cef3d
commit 9da7440717
2 changed files with 40 additions and 15 deletions

View File

@ -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", LOG_TRACE("can_execute_vectorizely", K(size));
K(can_exprs_execute_vectorizely)); return size;
return can_exprs_execute_vectorizely;
} }
int ObStaticEngineExprCG::divide_probably_local_exprs(common::ObIArray<ObRawExpr *> &exprs) int ObStaticEngineExprCG::divide_probably_local_exprs(common::ObIArray<ObRawExpr *> &exprs)
{ {

View File

@ -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);