From 7cc478b41c3a121bec427abcc01d08b6cf7d2a8e Mon Sep 17 00:00:00 2001 From: wangt1xiuyi <13547954130@163.com> Date: Tue, 7 May 2024 09:16:52 +0000 Subject: [PATCH] [CP] fix gather opt stats estimate percent bug and lock table stats bug --- src/pl/sys_package/ob_dbms_stats.cpp | 15 ++++++++++----- src/share/ob_virtual_table_iterator.cpp | 3 ++- src/share/stat/ob_dbms_stats_history_manager.cpp | 3 +-- src/share/stat/ob_dbms_stats_lock_unlock.cpp | 4 +--- src/share/stat/ob_incremental_stat_estimator.cpp | 5 +++-- src/sql/ob_sql_utils.cpp | 11 +++++++---- 6 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/pl/sys_package/ob_dbms_stats.cpp b/src/pl/sys_package/ob_dbms_stats.cpp index 82ee342910..9cb267dbf8 100644 --- a/src/pl/sys_package/ob_dbms_stats.cpp +++ b/src/pl/sys_package/ob_dbms_stats.cpp @@ -6134,9 +6134,14 @@ int ObDbmsStats::resovle_granularity(ObGranularityType granu_type, ObTableStatParam ¶m) { int ret = OB_SUCCESS; + bool is_specify_sample = param.sample_info_.is_sample_ && + param.sample_info_.sample_value_ >= 0.000001 && + param.sample_info_.sample_value_ < 100.0; if (ObGranularityType::GRANULARITY_AUTO == granu_type) { - param.global_stat_param_.set_gather_stat(param.part_name_.empty()); - param.part_stat_param_.set_gather_stat(param.part_name_.empty() && param.part_level_ == share::schema::ObPartitionLevel::PARTITION_LEVEL_TWO); + param.global_stat_param_.set_gather_stat(param.part_name_.empty() && !is_specify_sample); + param.part_stat_param_.set_gather_stat(param.part_name_.empty() && + param.part_level_ == share::schema::ObPartitionLevel::PARTITION_LEVEL_TWO && + !is_specify_sample); param.subpart_stat_param_.set_gather_stat(); // refine auto granularity based on subpart type if (ObPartitionLevel::PARTITION_LEVEL_TWO == param.part_level_ && @@ -6153,7 +6158,7 @@ int ObDbmsStats::resovle_granularity(ObGranularityType granu_type, param.subpart_stat_param_.reset_gather_stat(); } else if (ObGranularityType::GRANULARITY_APPROX_GLOBAL_AND_PARTITION == granu_type) { bool gather_approx = param.part_level_ != ObPartitionLevel::PARTITION_LEVEL_ZERO && !param.is_subpart_name_; - param.global_stat_param_.set_gather_stat(gather_approx); + param.global_stat_param_.set_gather_stat(gather_approx && !is_specify_sample); param.part_stat_param_.set_gather_stat(); param.subpart_stat_param_.reset_gather_stat(); } else if (ObGranularityType::GRANULARITY_GLOBAL == granu_type) { @@ -6161,7 +6166,7 @@ int ObDbmsStats::resovle_granularity(ObGranularityType granu_type, param.part_stat_param_.reset_gather_stat(); param.subpart_stat_param_.reset_gather_stat(); } else if (ObGranularityType::GRANULARITY_PARTITION == granu_type) { - if (param.part_name_.empty() && param.part_level_ != share::schema::ObPartitionLevel::PARTITION_LEVEL_ZERO) { + if (param.part_name_.empty() && param.part_level_ != share::schema::ObPartitionLevel::PARTITION_LEVEL_ZERO && !is_specify_sample) { param.global_stat_param_.set_gather_stat(true); } else { param.global_stat_param_.reset_gather_stat(); @@ -6171,7 +6176,7 @@ int ObDbmsStats::resovle_granularity(ObGranularityType granu_type, } else if (ObGranularityType::GRANULARITY_SUBPARTITION == granu_type) { param.global_stat_param_.reset_gather_stat(); param.part_stat_param_.reset_gather_stat(); - if (param.part_name_.empty() && param.part_level_ == share::schema::ObPartitionLevel::PARTITION_LEVEL_TWO) { + if (param.part_name_.empty() && param.part_level_ == share::schema::ObPartitionLevel::PARTITION_LEVEL_TWO && !is_specify_sample) { param.global_stat_param_.set_gather_stat(true); param.part_stat_param_.set_gather_stat(true); } else if (!param.part_name_.empty() && diff --git a/src/share/ob_virtual_table_iterator.cpp b/src/share/ob_virtual_table_iterator.cpp index bd509e6a5c..81a03da50b 100644 --- a/src/share/ob_virtual_table_iterator.cpp +++ b/src/share/ob_virtual_table_iterator.cpp @@ -347,7 +347,8 @@ int ObVirtualTableIterator::convert_output_row(ObNewRow *&cur_row) const ObColumnSchemaV2 *col_schema = cols_schema_.at(i); if (cur_row->get_cell(i).is_null() || (cur_row->get_cell(i).is_string_type() && 0 == cur_row->get_cell(i).get_data_length()) - || ob_is_empty_lob(cur_row->get_cell(i))) { + || ob_is_empty_lob(cur_row->get_cell(i)) + || (cur_row->get_cell(i).is_timestamp() && cur_row->get_cell(i).get_timestamp() <= 0)) { convert_row_.cells_[i].set_null(); } else if (OB_FAIL(ObObjCaster::to_type(col_schema->get_data_type(), col_schema->get_collation_type(), diff --git a/src/share/stat/ob_dbms_stats_history_manager.cpp b/src/share/stat/ob_dbms_stats_history_manager.cpp index 7f4be71107..fd9f6ba0a3 100644 --- a/src/share/stat/ob_dbms_stats_history_manager.cpp +++ b/src/share/stat/ob_dbms_stats_history_manager.cpp @@ -100,7 +100,7 @@ namespace common { FROM %s \ WHERE tenant_id = %lu and table_id = %lu %s" -#define TABLE_STAT_MOCK_VALUE_PATTERN "(%lu, %lu, %ld, usec_to_time(%ld), 0, 0, usec_to_time(%ld), 0, -1, -1, 0, 0, -1, 0, 0, 0, 0)" +#define TABLE_STAT_MOCK_VALUE_PATTERN "(%lu, %lu, %ld, usec_to_time(%ld), 0, 0, 0, 0, -1, -1, 0, 0, -1, 0, 0, 0, 0)" #define INSERT_COLUMN_STAT_HISTORY "INSERT INTO %s(tenant_id, \ table_id, \ @@ -394,7 +394,6 @@ int ObDbmsStatsHistoryManager::backup_no_table_part_stats(ObMySQLTransaction &tr share::schema::ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id), share::schema::ObSchemaUtils::get_extract_schema_id(tenant_id, table_id), partition_ids.at(idx++), - saving_time, saving_time))) { LOG_WARN("failed to append fmt", K(ret)); } else if (OB_FAIL(values_list.append_fmt("%s%s", diff --git a/src/share/stat/ob_dbms_stats_lock_unlock.cpp b/src/share/stat/ob_dbms_stats_lock_unlock.cpp index 668e1a7700..c4a9622515 100644 --- a/src/share/stat/ob_dbms_stats_lock_unlock.cpp +++ b/src/share/stat/ob_dbms_stats_lock_unlock.cpp @@ -616,7 +616,6 @@ int ObDbmsStatsLockUnlock::get_insert_locked_type_sql(const ObTableStatParam &pa uint64_t tenant_id = param.tenant_id_; uint64_t ext_tenant_id = share::schema::ObSchemaUtils::get_extract_tenant_id(tenant_id, tenant_id); uint64_t pure_table_id = share::schema::ObSchemaUtils::get_extract_schema_id(tenant_id, param.table_id_); - int64_t current_time = ObTimeUtility::current_time(); StatLevel stat_level = INVALID_LEVEL; int64_t cur_part_id = OB_INVALID_ID; for (int64_t i = 0; OB_SUCC(ret) && i < no_stats_partition_ids.count(); ++i) { @@ -631,14 +630,13 @@ int ObDbmsStatsLockUnlock::get_insert_locked_type_sql(const ObTableStatParam &pa stat_level = PARTITION_LEVEL; } char suffix = (i == no_stats_partition_ids.count() - 1 ? ';' : ','); - if (OB_FAIL(insert_sql.append_fmt("(%lu, %ld, %ld, %d, %u, usec_to_time('%ld'), -1, -1, 0, 0, -1,\ + if (OB_FAIL(insert_sql.append_fmt("(%lu, %ld, %ld, %d, %u, 0, -1, -1, 0, 0, -1,\ -1, 0, 0, %ld)%c", ext_tenant_id, pure_table_id, no_stats_partition_ids.at(i), param.is_index_stat_, stat_level, - current_time, part_stattypes.at(i), suffix))) { LOG_WARN("failed to append fmt", K(ret)); diff --git a/src/share/stat/ob_incremental_stat_estimator.cpp b/src/share/stat/ob_incremental_stat_estimator.cpp index 1fe43680be..f5d8ca1127 100644 --- a/src/share/stat/ob_incremental_stat_estimator.cpp +++ b/src/share/stat/ob_incremental_stat_estimator.cpp @@ -605,6 +605,7 @@ int ObIncrementalStatEstimator::derive_global_col_stat(ObExecContext &ctx, int64_t max_bucket_num = param.column_params_.at(i).bucket_num_; for (int64_t j = 0; OB_SUCC(ret) && j < part_cnt; ++j) { ObOptColumnStat *opt_col_stat = NULL; + ObOptTableStat *opt_tab_stat = part_opt_stats.at(j).table_stat_; for (int64_t k = 0; OB_SUCC(ret) && opt_col_stat == NULL && k < part_opt_stats.at(j).column_stats_.count(); ++k) { @@ -617,7 +618,7 @@ int ObIncrementalStatEstimator::derive_global_col_stat(ObExecContext &ctx, } } if (OB_FAIL(ret)) { - } else if (OB_ISNULL(opt_col_stat)) { + } else if (OB_ISNULL(opt_col_stat) || OB_ISNULL(opt_tab_stat)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret), K(part_opt_stats.at(j).column_stats_), K(param.column_params_.at(i))); @@ -633,7 +634,7 @@ int ObIncrementalStatEstimator::derive_global_col_stat(ObExecContext &ctx, min_eval.add(opt_col_stat->get_min_value()); max_eval.add(opt_col_stat->get_max_value()); ndv_eval.add(opt_col_stat->get_num_distinct(), opt_col_stat->get_llc_bitmap()); - not_null_eval.add(opt_col_stat->get_num_not_null()); + not_null_eval.add(opt_tab_stat->get_row_count() - opt_col_stat->get_num_null()); } if (opt_col_stat->get_avg_len() != 0) { avglen_eval.add(opt_col_stat->get_avg_len()); diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 04845f88db..2327bcb46b 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -4009,8 +4009,8 @@ int ObVirtualTableResultConverter::convert_output_row(ObNewRow *&src_row) ObObj src_obj = src_row->get_cell(i); if (tenant_id_col_id_ == column_id) { src_obj.set_uint64(cur_tenant_id_); - } else if (src_row->get_cell(i).is_string_type() && - 0 == src_row->get_cell(i).get_data_length()) { + } else if ((src_row->get_cell(i).is_string_type() && 0 == src_row->get_cell(i).get_data_length()) || + (src_row->get_cell(i).is_timestamp() && src_row->get_cell(i).get_timestamp() <= 0)) { need_cast = false; convert_row_.cells_[i].set_null(); } @@ -4051,7 +4051,9 @@ int ObVirtualTableResultConverter::convert_column(ObObj &src_obj, uint64_t colum LOG_WARN("column is not match", K(ret), K(column_id), K(col_schema->get_column_id())); } else if (tenant_id_col_id_ == column_id) { dst_obj.set_uint64(cur_tenant_id_); - } else if (src_obj.is_null() || (src_obj.is_string_type() && 0 == src_obj.get_data_length())) { + } else if (src_obj.is_null() || + (src_obj.is_string_type() && 0 == src_obj.get_data_length()) || + (src_obj.is_timestamp() && src_obj.get_timestamp() <= 0)) { need_cast = false; src_obj.set_null(); } else if (src_obj.is_ext()) { @@ -4100,7 +4102,8 @@ int ObVirtualTableResultConverter::convert_output_row( } else if (OB_FAIL(datum->to_obj(convert_row_.cells_[i], expr->obj_meta_))) { LOG_WARN("failed to cast obj", K(ret)); } else if (convert_row_.cells_[i].is_null() || - (convert_row_.cells_[i].is_string_type() && 0 == convert_row_.cells_[i].get_data_length())) { + (convert_row_.cells_[i].is_string_type() && 0 == convert_row_.cells_[i].get_data_length()) || + (convert_row_.cells_[i].is_timestamp() && convert_row_.cells_[i].get_timestamp() <= 0)) { convert_row_.cells_[i].set_null(); } else if (convert_row_.cells_[i].is_lob_storage()) { ObLobLocatorV2 lob;