reduce unnecessary sys view recompile
This commit is contained in:
parent
006fc03bf1
commit
db972bbeeb
@ -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();
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user