fix some master opt stats bug
This commit is contained in:
		@ -352,6 +352,7 @@ int ObDbmsStats::gather_table_index_stats(ObExecContext &ctx,
 | 
				
			|||||||
    ObTableStatParam index_param;
 | 
					    ObTableStatParam index_param;
 | 
				
			||||||
    index_param.assign_common_property(data_param);
 | 
					    index_param.assign_common_property(data_param);
 | 
				
			||||||
    const share::schema::ObTableSchema *index_schema = NULL;
 | 
					    const share::schema::ObTableSchema *index_schema = NULL;
 | 
				
			||||||
 | 
					    bool is_valid_index = true;
 | 
				
			||||||
    if (OB_FAIL(parse_table_part_info(ctx, stat_table, index_param))) {
 | 
					    if (OB_FAIL(parse_table_part_info(ctx, stat_table, index_param))) {
 | 
				
			||||||
      LOG_WARN("failed to parse table part info", K(ret));
 | 
					      LOG_WARN("failed to parse table part info", K(ret));
 | 
				
			||||||
    } else if (OB_ISNULL(schema_guard) ||
 | 
					    } else if (OB_ISNULL(schema_guard) ||
 | 
				
			||||||
@ -361,10 +362,12 @@ int ObDbmsStats::gather_table_index_stats(ObExecContext &ctx,
 | 
				
			|||||||
                OB_ISNULL(index_schema)) {
 | 
					                OB_ISNULL(index_schema)) {
 | 
				
			||||||
      ret = OB_ERR_UNEXPECTED;
 | 
					      ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
      LOG_WARN("failed to get index schema", K(ret), K(stat_table));
 | 
					      LOG_WARN("failed to get index schema", K(ret), K(stat_table));
 | 
				
			||||||
 | 
					    } else if (!index_schema->is_normal_index() && !index_schema->is_unique_index()) {
 | 
				
			||||||
 | 
					      is_valid_index = false;
 | 
				
			||||||
    } else if (index_schema->is_global_index_table()) {
 | 
					    } else if (index_schema->is_global_index_table()) {
 | 
				
			||||||
      index_param.is_global_index_ = true;
 | 
					      index_param.is_global_index_ = true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (OB_SUCC(ret)) {
 | 
					    if (OB_SUCC(ret) && is_valid_index) {
 | 
				
			||||||
      index_param.is_index_stat_ = true;
 | 
					      index_param.is_index_stat_ = true;
 | 
				
			||||||
      index_param.global_stat_param_ = data_param.global_stat_param_;
 | 
					      index_param.global_stat_param_ = data_param.global_stat_param_;
 | 
				
			||||||
      index_param.part_stat_param_.assign_without_part_type(data_param.part_stat_param_);
 | 
					      index_param.part_stat_param_.assign_without_part_type(data_param.part_stat_param_);
 | 
				
			||||||
@ -435,6 +438,8 @@ int ObDbmsStats::fast_gather_index_stats(ObExecContext &ctx,
 | 
				
			|||||||
                 OB_ISNULL(index_schema)) {
 | 
					                 OB_ISNULL(index_schema)) {
 | 
				
			||||||
        ret = OB_ERR_UNEXPECTED;
 | 
					        ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
        LOG_WARN("failed to get index schema", K(ret), K(stat_table));
 | 
					        LOG_WARN("failed to get index schema", K(ret), K(stat_table));
 | 
				
			||||||
 | 
					      } else if (!index_schema->is_normal_index() && !index_schema->is_unique_index()) {
 | 
				
			||||||
 | 
					        is_fast_gather = false;
 | 
				
			||||||
      //glboal index can't reuse the partition data in fast gather index
 | 
					      //glboal index can't reuse the partition data in fast gather index
 | 
				
			||||||
      } else if (index_schema->is_global_index_table()) {
 | 
					      } else if (index_schema->is_global_index_table()) {
 | 
				
			||||||
        index_param.is_global_index_ = true;
 | 
					        index_param.is_global_index_ = true;
 | 
				
			||||||
@ -3274,6 +3279,11 @@ int ObDbmsStats::init_column_stat_params(ObIAllocator &allocator,
 | 
				
			|||||||
        if (ObColumnStatParam::is_valid_avglen_type(col->get_meta_type().get_type())) {
 | 
					        if (ObColumnStatParam::is_valid_avglen_type(col->get_meta_type().get_type())) {
 | 
				
			||||||
          col_param.set_need_avg_len();
 | 
					          col_param.set_need_avg_len();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        //check can gather hist type, for longtext type, we disable gather hist
 | 
				
			||||||
 | 
					        if (ob_obj_type_class(col->get_meta_type().get_type()) == ColumnTypeClass::ObTextTC &&
 | 
				
			||||||
 | 
					            col->get_meta_type().get_type() != ObTinyTextType) {
 | 
				
			||||||
 | 
					          col_param.set_no_need_histogram();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (col->is_rowkey_column() && !table_schema.is_heap_table()) {
 | 
					      if (col->is_rowkey_column() && !table_schema.is_heap_table()) {
 | 
				
			||||||
        col_param.set_is_index_column();
 | 
					        col_param.set_is_index_column();
 | 
				
			||||||
@ -3738,6 +3748,10 @@ int ObDbmsStats::parse_index_table_info(ObExecContext &ctx,
 | 
				
			|||||||
                                    K(index_name));
 | 
					                                    K(index_name));
 | 
				
			||||||
    LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(data_table_param.db_name_),
 | 
					    LOG_USER_ERROR(OB_TABLE_NOT_EXIST, to_cstring(data_table_param.db_name_),
 | 
				
			||||||
                                      to_cstring(index_name));
 | 
					                                      to_cstring(index_name));
 | 
				
			||||||
 | 
					  } else if (!index_schema->is_normal_index() && !index_schema->is_unique_index()) {
 | 
				
			||||||
 | 
					    ret = OB_NOT_SUPPORTED;
 | 
				
			||||||
 | 
					    LOG_WARN("not support index tpye", K(ret), K(index_schema->get_index_type()));
 | 
				
			||||||
 | 
					    LOG_USER_ERROR(OB_NOT_SUPPORTED, "gather non-normal index stats");
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    param.tab_name_ = index_name;
 | 
					    param.tab_name_ = index_name;
 | 
				
			||||||
    param.db_name_ = data_table_param.db_name_;
 | 
					    param.db_name_ = data_table_param.db_name_;
 | 
				
			||||||
 | 
				
			|||||||
@ -230,6 +230,7 @@ int ObDbmsStatsUtils::check_is_sys_table(share::schema::ObSchemaGetterGuard &sch
 | 
				
			|||||||
  if (!is_sys_table(table_id) ||
 | 
					  if (!is_sys_table(table_id) ||
 | 
				
			||||||
      ObSysTableChecker::is_sys_table_index_tid(table_id) ||
 | 
					      ObSysTableChecker::is_sys_table_index_tid(table_id) ||
 | 
				
			||||||
      is_sys_lob_table(table_id) ||
 | 
					      is_sys_lob_table(table_id) ||
 | 
				
			||||||
 | 
					      table_id == share::OB_ALL_CORE_TABLE_TID ||//circular dependency,
 | 
				
			||||||
      table_id == share::OB_ALL_TABLE_STAT_TID ||
 | 
					      table_id == share::OB_ALL_TABLE_STAT_TID ||
 | 
				
			||||||
      table_id == share::OB_ALL_COLUMN_STAT_TID ||
 | 
					      table_id == share::OB_ALL_COLUMN_STAT_TID ||
 | 
				
			||||||
      table_id == share::OB_ALL_HISTOGRAM_STAT_TID ||
 | 
					      table_id == share::OB_ALL_HISTOGRAM_STAT_TID ||
 | 
				
			||||||
 | 
				
			|||||||
@ -54,8 +54,7 @@ bool ObColumnStatParam::is_valid_opt_col_type(const ObObjType type)
 | 
				
			|||||||
      type_class == ColumnTypeClass::ObEnumSetTC ||
 | 
					      type_class == ColumnTypeClass::ObEnumSetTC ||
 | 
				
			||||||
      type_class == ColumnTypeClass::ObIntervalTC ||
 | 
					      type_class == ColumnTypeClass::ObIntervalTC ||
 | 
				
			||||||
      type_class == ColumnTypeClass::ObDecimalIntTC ||
 | 
					      type_class == ColumnTypeClass::ObDecimalIntTC ||
 | 
				
			||||||
      (lib::is_mysql_mode() && (type == ObTinyTextType ||
 | 
					      (lib::is_mysql_mode() && type_class == ColumnTypeClass::ObTextTC)) {
 | 
				
			||||||
                                type == ObTextType))) {
 | 
					 | 
				
			||||||
    ret = true;
 | 
					    ret = true;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return ret;
 | 
					  return ret;
 | 
				
			||||||
 | 
				
			|||||||
@ -113,7 +113,8 @@ enum ColumnGatherFlag
 | 
				
			|||||||
  NO_NEED_STAT          = 0,
 | 
					  NO_NEED_STAT          = 0,
 | 
				
			||||||
  VALID_OPT_COL         = 1,
 | 
					  VALID_OPT_COL         = 1,
 | 
				
			||||||
  NEED_BASIC_STAT       = 1 << 1,
 | 
					  NEED_BASIC_STAT       = 1 << 1,
 | 
				
			||||||
  NEED_AVG_LEN          = 1 << 2
 | 
					  NEED_AVG_LEN          = 1 << 2,
 | 
				
			||||||
 | 
					  NO_NEED_HISTOGRAM     = 1 << 3
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ObGranularityType
 | 
					enum ObGranularityType
 | 
				
			||||||
@ -374,9 +375,11 @@ struct ObColumnStatParam {
 | 
				
			|||||||
  inline void set_valid_opt_col() { gather_flag_ |= ColumnGatherFlag::VALID_OPT_COL; }
 | 
					  inline void set_valid_opt_col() { gather_flag_ |= ColumnGatherFlag::VALID_OPT_COL; }
 | 
				
			||||||
  inline void set_need_basic_stat() { gather_flag_ |= ColumnGatherFlag::NEED_BASIC_STAT; }
 | 
					  inline void set_need_basic_stat() { gather_flag_ |= ColumnGatherFlag::NEED_BASIC_STAT; }
 | 
				
			||||||
  inline void set_need_avg_len() { gather_flag_ |= ColumnGatherFlag::NEED_AVG_LEN; }
 | 
					  inline void set_need_avg_len() { gather_flag_ |= ColumnGatherFlag::NEED_AVG_LEN; }
 | 
				
			||||||
 | 
					  inline void set_no_need_histogram() { gather_flag_ |= ColumnGatherFlag::NO_NEED_HISTOGRAM; }
 | 
				
			||||||
  inline bool is_valid_opt_col() const { return gather_flag_ & ColumnGatherFlag::VALID_OPT_COL; }
 | 
					  inline bool is_valid_opt_col() const { return gather_flag_ & ColumnGatherFlag::VALID_OPT_COL; }
 | 
				
			||||||
  inline bool need_basic_stat() const { return gather_flag_ & ColumnGatherFlag::NEED_BASIC_STAT; }
 | 
					  inline bool need_basic_stat() const { return gather_flag_ & ColumnGatherFlag::NEED_BASIC_STAT; }
 | 
				
			||||||
  inline bool need_avg_len() const { return gather_flag_ & ColumnGatherFlag::NEED_AVG_LEN; }
 | 
					  inline bool need_avg_len() const { return gather_flag_ & ColumnGatherFlag::NEED_AVG_LEN; }
 | 
				
			||||||
 | 
					  inline bool is_no_need_histogram() const { return gather_flag_ & ColumnGatherFlag::NO_NEED_HISTOGRAM; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ObString column_name_;
 | 
					  ObString column_name_;
 | 
				
			||||||
  uint64_t column_id_;
 | 
					  uint64_t column_id_;
 | 
				
			||||||
 | 
				
			|||||||
@ -207,10 +207,10 @@ int ObStatLlcBitmap::decode(ObObj &obj)
 | 
				
			|||||||
  ObString llc_bitmap_buf;
 | 
					  ObString llc_bitmap_buf;
 | 
				
			||||||
  if (OB_ISNULL(col_stat_) ||
 | 
					  if (OB_ISNULL(col_stat_) ||
 | 
				
			||||||
      OB_ISNULL(col_stat_->get_llc_bitmap()) ||
 | 
					      OB_ISNULL(col_stat_->get_llc_bitmap()) ||
 | 
				
			||||||
      OB_UNLIKELY(!obj.is_varchar())) {
 | 
					      OB_UNLIKELY(!obj.is_varchar() && !obj.is_varbinary())) {
 | 
				
			||||||
    ret = OB_ERR_UNEXPECTED;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
    LOG_WARN("get unexpected null", K(ret), K(col_stat_), K(obj));
 | 
					    LOG_WARN("get unexpected null", K(ret), K(col_stat_), K(obj));
 | 
				
			||||||
  } else if (OB_FAIL(obj.get_varchar(llc_bitmap_buf))) {
 | 
					  } else if (OB_FAIL(obj.get_string(llc_bitmap_buf))) {
 | 
				
			||||||
    LOG_WARN("failed to get varchar", K(ret));
 | 
					    LOG_WARN("failed to get varchar", K(ret));
 | 
				
			||||||
  } else if (OB_UNLIKELY(llc_bitmap_buf.length() > col_stat_->get_llc_bitmap_size())) {
 | 
					  } else if (OB_UNLIKELY(llc_bitmap_buf.length() > col_stat_->get_llc_bitmap_size())) {
 | 
				
			||||||
    ret = OB_ERR_UNEXPECTED;
 | 
					    ret = OB_ERR_UNEXPECTED;
 | 
				
			||||||
@ -227,6 +227,7 @@ bool ObStatTopKHist::is_needed() const
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  return NULL != col_param_ &&
 | 
					  return NULL != col_param_ &&
 | 
				
			||||||
         col_param_->need_basic_stat() &&
 | 
					         col_param_->need_basic_stat() &&
 | 
				
			||||||
 | 
					         !col_param_->is_no_need_histogram() &&
 | 
				
			||||||
         col_param_->bucket_num_ > 1;
 | 
					         col_param_->bucket_num_ > 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -750,7 +750,7 @@ int ObAccessService::put_rows(
 | 
				
			|||||||
    if (OB_SUCC(ret)) {
 | 
					    if (OB_SUCC(ret)) {
 | 
				
			||||||
      int tmp_ret = audit_tablet_opt_dml_stat(dml_param,
 | 
					      int tmp_ret = audit_tablet_opt_dml_stat(dml_param,
 | 
				
			||||||
                                              tablet_id,
 | 
					                                              tablet_id,
 | 
				
			||||||
                                              ObOptDmlStatType::TABLET_OPT_UPDATE_STAT,
 | 
					                                              ObOptDmlStatType::TABLET_OPT_INSERT_STAT,
 | 
				
			||||||
                                              affected_rows);
 | 
					                                              affected_rows);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user