From db972bbeebcc10f0ded8d7414e50308f8d55cbec Mon Sep 17 00:00:00 2001 From: "18523270951@163.com" <18523270951@163.com> Date: Thu, 28 Mar 2024 03:46:16 +0000 Subject: [PATCH] reduce unnecessary sys view recompile --- .../ob_information_columns_table.cpp | 7 ++- .../ob_maintain_dependency_info_task.cpp | 8 ++- .../ob_maintain_dependency_info_task.h | 5 ++ src/sql/ob_sql_utils.cpp | 59 ++++++++++++++++++- src/sql/ob_sql_utils.h | 3 + 5 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/observer/virtual_table/ob_information_columns_table.cpp b/src/observer/virtual_table/ob_information_columns_table.cpp index 0ed9abedfe..f3712f26c4 100644 --- a/src/observer/virtual_table/ob_information_columns_table.cpp +++ b/src/observer/virtual_table/ob_information_columns_table.cpp @@ -23,6 +23,7 @@ #include "sql/session/ob_sql_session_info.h" #include "sql/parser/ob_parser.h" #include "sql/resolver/dml/ob_select_resolver.h" +#include "sql/ob_sql.h" namespace oceanbase { @@ -238,7 +239,11 @@ int ObInfoSchemaColumnsTable::iterate_table_schema_array(const bool is_filter_ta bool view_is_invalid = (0 == table_schema->get_object_status() || 0 == table_schema->get_column_count() || (table_schema->is_sys_view() - && table_schema->get_schema_version() <= GCTX.start_time_)); + && table_schema->get_schema_version() <= GCTX.start_time_ + && (nullptr == GCTX.sql_engine_ + || OB_HASH_NOT_EXIST == GCTX.sql_engine_->get_dep_info_queue() + .read_consistent_sys_view_from_set(table_schema->get_tenant_id(), + table_schema->get_table_id())))); if (OB_FAIL(ret)) { } else if (is_normal_view && view_is_invalid) { mem_context_->reset_remain_one_page(); diff --git a/src/sql/executor/ob_maintain_dependency_info_task.cpp b/src/sql/executor/ob_maintain_dependency_info_task.cpp index 101d91717f..fb78b985b7 100644 --- a/src/sql/executor/ob_maintain_dependency_info_task.cpp +++ b/src/sql/executor/ob_maintain_dependency_info_task.cpp @@ -200,6 +200,8 @@ int ObMaintainDepInfoTaskQueue::init(const int64_t thread_cnt, const int64_t que LOG_WARN("failed to init base queue", K(ret)); } else if (OB_FAIL(view_info_set_.create(INIT_BKT_SIZE, attr, attr))) { LOG_WARN("failed to init view set", K(ret)); + } else if (OB_FAIL(sys_view_consistent_.create(INIT_BKT_SIZE, attr, attr))) { + LOG_WARN("failed to init sys view set", K(ret)); } return ret; } @@ -220,7 +222,11 @@ void ObMaintainDepInfoTaskQueue::run2() LOG_WARN("queue size not match", K(queue_.size()), K(view_info_set_.size())); view_info_set_.clear(); } - LOG_INFO("[ASYNC TASK QUEUE]", "queue_size", queue_.size()); + if (sys_view_consistent_.size() >= MAX_SYS_VIEW_SIZE) { + LOG_WARN("sys_view_consistent size too much", K(sys_view_consistent_.size())); + sys_view_consistent_.clear(); + } + LOG_INFO("[ASYNC TASK QUEUE]", K(queue_.size()), K(sys_view_consistent_.size())); } if (last_execute_time_ > 0 && static_cast(GCONF._ob_obj_dep_maint_task_interval) > 0) { diff --git a/src/sql/executor/ob_maintain_dependency_info_task.h b/src/sql/executor/ob_maintain_dependency_info_task.h index 25d09a468b..2541792d07 100644 --- a/src/sql/executor/ob_maintain_dependency_info_task.h +++ b/src/sql/executor/ob_maintain_dependency_info_task.h @@ -90,11 +90,13 @@ class ObMaintainDepInfoTaskQueue: public share::ObAsyncTaskQueue { public: static const int64_t INIT_BKT_SIZE = 512; + static const int64_t MAX_SYS_VIEW_SIZE = 65536; constexpr static const double MAX_QUEUE_USAGE_RATIO = 0.8; ObMaintainDepInfoTaskQueue() : last_execute_time_(0) {} virtual ~ObMaintainDepInfoTaskQueue() { view_info_set_.destroy(); + sys_view_consistent_.destroy(); } int init(const int64_t thread_cnt, const int64_t queue_size); virtual void run2() override; @@ -103,10 +105,13 @@ public: { last_execute_time_ = execute_time; } int add_view_id_to_set(const uint64_t view_id) { return view_info_set_.set_refactored(view_id); } int erase_view_id_from_set(const uint64_t view_id) { return view_info_set_.erase_refactored(view_id); } + int add_consistent_sys_view_id_to_set(const uint64_t tenant_id, const uint64_t view_id) { return sys_view_consistent_.set_refactored(std::make_pair(tenant_id, view_id)); } + int read_consistent_sys_view_from_set(const uint64_t tenant_id, const uint64_t view_id) { return sys_view_consistent_.exist_refactored(std::make_pair(tenant_id, view_id)); } bool is_queue_almost_full() const { return queue_.size() > queue_.capacity() * MAX_QUEUE_USAGE_RATIO; } private: int64_t last_execute_time_; common::hash::ObHashSet view_info_set_; + common::hash::ObHashSet, common::hash::ReadWriteDefendMode> sys_view_consistent_; }; } // namespace sql diff --git a/src/sql/ob_sql_utils.cpp b/src/sql/ob_sql_utils.cpp index 21cb612ac7..6d1631197f 100644 --- a/src/sql/ob_sql_utils.cpp +++ b/src/sql/ob_sql_utils.cpp @@ -5373,6 +5373,7 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie int ret = OB_SUCCESS; ObTableSchema new_view_schema(&alloc); uint64_t data_version = 0; + bool changed = false; if (OB_FAIL(new_view_schema.assign(old_view_schema))) { LOG_WARN("failed to assign table schema", K(ret)); } else if (OB_FAIL(GET_MIN_DATA_VERSION(old_view_schema.get_tenant_id(), data_version))) { @@ -5385,7 +5386,10 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie } else if ((0 == old_view_schema.get_object_status() || 0 == old_view_schema.get_column_count() || (old_view_schema.is_sys_view() - && old_view_schema.get_schema_version() <= GCTX.start_time_))) { + && old_view_schema.get_schema_version() <= GCTX.start_time_ + && OB_HASH_NOT_EXIST == GCTX.sql_engine_->get_dep_info_queue() + .read_consistent_sys_view_from_set(old_view_schema.get_tenant_id(), + old_view_schema.get_table_id())))) { if (old_view_schema.is_sys_view() && GCONF.in_upgrade_mode()) { //do not recompile sys view until upgrade finish } else if (!reset_column_infos) { @@ -5403,7 +5407,9 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie } else if (!new_view_schema.is_view_table() || new_view_schema.get_column_count() <= 0) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get wrong schema", K(ret), K(new_view_schema)); - } else if (!select_stmt->get_ref_obj_table()->is_inited()) { + } else if (old_view_schema.is_sys_view() && OB_FAIL(check_sys_view_changed(old_view_schema, new_view_schema, changed))) { + LOG_WARN("failed to check sys view changed", K(ret)); + } else if (!select_stmt->get_ref_obj_table()->is_inited() || !changed) { // do nothing } else if (OB_FAIL(GCTX.sql_engine_->get_dep_info_queue().add_view_id_to_set(new_view_schema.get_table_id()))) { if (OB_HASH_EXIST == ret) { @@ -5457,6 +5463,55 @@ int ObSQLUtils::async_recompile_view(const share::schema::ObTableSchema &old_vie return ret; } +int ObSQLUtils::check_sys_view_changed(const share::schema::ObTableSchema &old_view_schema, + const share::schema::ObTableSchema &new_view_schema, + bool &changed) +{ + int ret = OB_SUCCESS; + changed = false; + if (old_view_schema.get_column_count() != new_view_schema.get_column_count()) { + changed = true; + LOG_TRACE("sys view changed, need recompile task", K(old_view_schema.get_tenant_id()), + K(old_view_schema.get_table_id()), K(old_view_schema.get_column_count()), + K(new_view_schema.get_column_count())); + } else { + for (int64_t i = 0; OB_SUCC(ret) && !changed && i < old_view_schema.get_column_count(); ++i) { + const ObColumnSchemaV2 *old_col = old_view_schema.get_column_schema_by_idx(i); + const ObColumnSchemaV2 *new_col = new_view_schema.get_column_schema_by_idx(i); + if (OB_ISNULL(old_col) || OB_ISNULL(new_col)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get null column", K(ret), K(old_view_schema.get_table_id()), K(i), KP(old_col), KP(new_col)); + } else if (0 != old_col->get_column_name_str().case_compare(new_col->get_column_name_str())) { + changed = true; + LOG_TRACE("sys view changed, need recompile task", K(old_view_schema.get_tenant_id()), + K(old_view_schema.get_table_id()), K(i), + K(old_col->get_column_name_str()), K(new_col->get_column_name_str())); + } else if (old_col->get_data_type() != new_col->get_data_type() + || old_col->get_data_length() != new_col->get_data_length() + || (ob_is_accurate_numeric_type(old_col->get_data_type()) + && old_col->get_data_precision() != new_col->get_data_precision()) + || (ob_is_accurate_numeric_type(old_col->get_data_type()) + && old_col->get_data_scale() != new_col->get_data_scale())) { + changed = true; + LOG_TRACE("sys view changed, need recompile task", K(old_view_schema.get_tenant_id()), + K(old_view_schema.get_table_id()), K(i), + K(old_col->get_data_type()), K(new_col->get_data_type()), + K(old_col->get_data_length()), K(new_col->get_data_length()), + K(old_col->get_data_precision()), K(new_col->get_data_precision()), + K(old_col->get_data_scale()), K(new_col->get_data_scale())); + } + } + } + if (!changed) { + if (OB_FAIL(GCTX.sql_engine_->get_dep_info_queue() + .add_consistent_sys_view_id_to_set(old_view_schema.get_tenant_id(), + old_view_schema.get_table_id()))) { + LOG_WARN("failed to add sys view", K(ret)); + } + } + return ret; +} + int ObSQLUtils::find_synonym_ref_obj(const ObString &database_name, const ObString &object_name, const uint64_t tenant_id, diff --git a/src/sql/ob_sql_utils.h b/src/sql/ob_sql_utils.h index 1e263f4511..c0a44eb3d0 100644 --- a/src/sql/ob_sql_utils.h +++ b/src/sql/ob_sql_utils.h @@ -661,6 +661,9 @@ public: bool reset_column_infos, common::ObIAllocator &alloc, sql::ObSQLSessionInfo &session_info); + static int check_sys_view_changed(const share::schema::ObTableSchema &old_view_schema, + const share::schema::ObTableSchema &new_view_schema, + bool &changed); static int find_synonym_ref_obj(const ObString &database_name, const ObString &object_name, const uint64_t tenant_id,