reduce unnecessary sys view recompile

This commit is contained in:
18523270951@163.com 2024-03-28 03:46:16 +00:00 committed by ob-robot
parent 006fc03bf1
commit db972bbeeb
5 changed files with 78 additions and 4 deletions

View File

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

View File

@ -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<int64_t>(GCONF._ob_obj_dep_maint_task_interval) > 0) {

View File

@ -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<uint64_t, common::hash::ReadWriteDefendMode> view_info_set_;
common::hash::ObHashSet<std::pair<uint64_t, uint64_t>, common::hash::ReadWriteDefendMode> sys_view_consistent_;
};
} // namespace sql

View File

@ -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,

View File

@ -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,