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",
 | 
					  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)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
@ -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