diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 108e0f7d23..04210846a3 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -10004,6 +10004,7 @@ int ObJoinOrder::check_subquery_in_join_condition(const ObJoinType join_type, int ObJoinOrder::extract_used_columns(const uint64_t table_id, const uint64_t ref_table_id, + bool only_normal_ref_expr, ObIArray &column_ids, ObIArray &columns) { @@ -10046,8 +10047,11 @@ int ObJoinOrder::extract_used_columns(const uint64_t table_id, ret = OB_ERR_UNEXPECTED; LOG_WARN("column item or item expr is NULL", K(ret), K(col_item)); } else if (col_item->table_id_ == table_id && - col_item->expr_->is_explicited_reference() ) { - if( OB_FAIL(add_var_to_array_no_dup(column_ids, col_item->expr_->get_column_id()))) { + col_item->expr_->is_explicited_reference() && + !col_item->expr_->is_only_referred_by_stored_gen_col()) { + if (only_normal_ref_expr && !col_item->expr_->is_referred_by_normal()) { + //do nothing + } else if( OB_FAIL(add_var_to_array_no_dup(column_ids, col_item->expr_->get_column_id()))) { LOG_WARN("Fail to add column id", K(ret)); } else if (OB_FAIL(columns.push_back(*col_item))) { LOG_WARN("failed to pushback column item", K(ret)); @@ -10090,6 +10094,7 @@ int ObJoinOrder::get_simple_index_info(const uint64_t table_id, LOG_WARN("failed to get index schema", K(ret)); } else if (OB_FAIL(extract_used_columns(table_id, ref_table_id, + true, column_ids, dummy_columns))) { LOG_WARN("failed to extract column ids", K(table_id), K(ref_table_id), K(ret)); @@ -10482,6 +10487,7 @@ int ObJoinOrder::fill_path_index_meta_info(const uint64_t table_id, ObSEArray dummy_columns; if (OB_FAIL(extract_used_columns(table_id, ref_table_id, + index_id != ref_table_id && !ap->est_cost_info_.index_meta_info_.is_index_back_, ap->est_cost_info_.access_columns_, dummy_columns))) { LOG_WARN("failed to extract used column ids", K(ret)); diff --git a/src/sql/optimizer/ob_join_order.h b/src/sql/optimizer/ob_join_order.h index fcd23ba615..2a85645901 100644 --- a/src/sql/optimizer/ob_join_order.h +++ b/src/sql/optimizer/ob_join_order.h @@ -1259,6 +1259,7 @@ struct NullAwareAntiJoinInfo { int extract_used_columns(const uint64_t table_id, const uint64_t ref_table_id, + bool only_normal_ref_expr, ObIArray &column_ids, ObIArray &columns); diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 6783a9a684..0304161cae 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -12851,10 +12851,10 @@ int ObLogPlan::get_part_exprs(uint64_t table_id, part_expr = stmt->get_part_expr(table_id, ref_table_id); subpart_expr = stmt->get_subpart_expr(table_id, ref_table_id); if (NULL != part_expr) { - part_expr->set_explicited_reference(); + part_expr->set_part_key_reference(); } if (NULL != subpart_expr) { - subpart_expr->set_explicited_reference(); + subpart_expr->set_part_key_reference(); } } diff --git a/src/sql/optimizer/ob_log_table_scan.cpp b/src/sql/optimizer/ob_log_table_scan.cpp index 06270bcce4..f9b5d6e1bb 100644 --- a/src/sql/optimizer/ob_log_table_scan.cpp +++ b/src/sql/optimizer/ob_log_table_scan.cpp @@ -310,8 +310,13 @@ int ObLogTableScan::generate_access_exprs() if (OB_ISNULL(col_item) || OB_ISNULL(col_item->expr_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(col_item), K(ret)); - } else if (col_item->table_id_ == table_id_ && col_item->expr_->is_explicited_reference() && - OB_FAIL(temp_exprs.push_back(col_item->expr_))) { + } else if (col_item->table_id_ != table_id_ || !col_item->expr_->is_explicited_reference()) { + //do nothing + } else if (col_item->expr_->is_only_referred_by_stored_gen_col()) { + //skip if is only referred by stored generated columns which don't need to be recalculated + } else if (is_index_scan() && !get_index_back() && !col_item->expr_->is_referred_by_normal()) { + //skip the dependant columns of partkeys and generated columns if index_back is false in index scan + } else if (OB_FAIL(temp_exprs.push_back(col_item->expr_))) { LOG_WARN("failed to push back expr", K(ret)); } else { /*do nothing*/} } diff --git a/src/sql/resolver/dml/ob_dml_stmt.cpp b/src/sql/resolver/dml/ob_dml_stmt.cpp index ea80c748e5..c5360390c7 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.cpp +++ b/src/sql/resolver/dml/ob_dml_stmt.cpp @@ -1844,7 +1844,7 @@ int ObDMLStmt::formalize_stmt_expr_reference() if (OB_ISNULL(stmt_exprs.at(i))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(set_sharable_expr_reference(*stmt_exprs.at(i), false))) { + } else if (OB_FAIL(set_sharable_expr_reference(*stmt_exprs.at(i), ExplicitedRefType::REF_BY_NORMAL))) { LOG_WARN("failed to set sharable expr reference", K(ret)); } else { /*do nothing*/ } } @@ -1860,7 +1860,7 @@ int ObDMLStmt::formalize_stmt_expr_reference() table_item->is_json_table() || table_item->for_update_ || is_hierarchical_query()) { - if (OB_FAIL(set_sharable_expr_reference(*column_item.expr_, false))) { + if (OB_FAIL(set_sharable_expr_reference(*column_item.expr_, ExplicitedRefType::REF_BY_NORMAL))) { LOG_WARN("failed to set sharable exprs reference", K(ret)); } } else { /*do nothing*/ } @@ -1929,25 +1929,26 @@ int ObDMLStmt::check_pseudo_column_valid() return ret; } -int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, bool is_under_depend_expr) +int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, ExplicitedRefType ref_type) { int ret = OB_SUCCESS; if (expr.is_column_ref_expr() || expr.is_aggr_expr() || expr.is_win_func_expr() || expr.is_query_ref_expr() || ObRawExprUtils::is_pseudo_column_like_expr(expr)) { - expr.set_explicited_reference(); + expr.set_explicited_reference(ref_type); if (expr.is_column_ref_expr()) { ObColumnRefRawExpr &column_expr = static_cast(expr); + ref_type = column_expr.is_stored_generated_column() ? ExplicitedRefType::REF_BY_STORED_GEN_COL : ExplicitedRefType::REF_BY_VIRTUAL_GEN_COL; if (NULL == get_column_item(column_expr.get_table_id(), column_expr.get_column_id())) { - if (is_under_depend_expr) { + if (ExplicitedRefType::REF_BY_NORMAL != ref_type) { expr.clear_explicited_referece(); } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("expr's column item is not existed", K(ret), K(expr), KPC(this)); } } else if (NULL != column_expr.get_dependant_expr() && - OB_FAIL(SMART_CALL(set_sharable_expr_reference(*column_expr.get_dependant_expr(), true)))) { + OB_FAIL(SMART_CALL(set_sharable_expr_reference(*column_expr.get_dependant_expr(), ref_type)))) { LOG_WARN("failed to set sharable expr", K(ret), K(column_expr)); } } else if (T_ORA_ROWSCN == expr.get_expr_type() && @@ -1974,7 +1975,7 @@ int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, bool is_under_depend ret = OB_ERR_UNEXPECTED; LOG_WARN("exec param expr is null", K(ret)); } else if (exec_param.has_flag(IS_ONETIME) && - OB_FAIL(SMART_CALL(set_sharable_expr_reference(*exec_param.get_ref_expr(), is_under_depend_expr)))) { + OB_FAIL(SMART_CALL(set_sharable_expr_reference(*exec_param.get_ref_expr(), ref_type)))) { LOG_WARN("failed to set sharable expr refernece", K(ret)); } } @@ -1988,7 +1989,7 @@ int ObDMLStmt::set_sharable_expr_reference(ObRawExpr &expr, bool is_under_depend if (OB_ISNULL(expr.get_param_expr(i))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null", K(ret)); - } else if (OB_FAIL(SMART_CALL(set_sharable_expr_reference(*expr.get_param_expr(i), is_under_depend_expr)))) { + } else if (OB_FAIL(SMART_CALL(set_sharable_expr_reference(*expr.get_param_expr(i), ref_type)))) { LOG_WARN("failed to set sharable expr", K(ret), K(expr)); } else { /*do nothing*/ } } diff --git a/src/sql/resolver/dml/ob_dml_stmt.h b/src/sql/resolver/dml/ob_dml_stmt.h index 7c1e55c1e5..0d462886d0 100644 --- a/src/sql/resolver/dml/ob_dml_stmt.h +++ b/src/sql/resolver/dml/ob_dml_stmt.h @@ -798,7 +798,7 @@ public: int do_remove_const_exec_param(ObRawExpr *&expr, bool &is_happened); int formalize_stmt_expr_reference(); int formalize_child_stmt_expr_reference(); - int set_sharable_expr_reference(ObRawExpr &expr, bool is_under_depend_expr); + int set_sharable_expr_reference(ObRawExpr &expr, ExplicitedRefType ref_type); int check_pseudo_column_valid(); int get_ora_rowscn_column(const uint64_t table_id, ObPseudoColumnRawExpr *&ora_rowscn); virtual int remove_useless_sharable_expr(); diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index e7409262a6..9ed5e8db3e 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -248,7 +248,7 @@ int ObRawExpr::assign(const ObRawExpr &other) alias_column_name_ = other.alias_column_name_; expr_name_= other.expr_name_; ref_count_ = other.ref_count_; - is_explicited_reference_ = other.is_explicited_reference_; + reference_type_ = other.reference_type_; is_for_generated_column_ = other.is_for_generated_column_; extra_ = other.extra_; is_called_in_sql_ = other.is_called_in_sql_; @@ -321,7 +321,7 @@ void ObRawExpr::reset() rel_ids_.reset(); set_data_type(ObMaxType); ref_count_ = 0; - is_explicited_reference_ = false; + reference_type_ = ExplicitedRefType::NONE_REF; is_for_generated_column_ = false; is_called_in_sql_ = true; is_calculated_ = false; diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index 92349a77c1..5f43b8debb 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -1590,6 +1590,13 @@ typedef ObResolveContext ObExprResolveContext; class ObRawExprVisitor; struct ObHiddenColumnItem; +enum ExplicitedRefType { + NONE_REF = 0, + REF_BY_NORMAL = 1 << 0, + REF_BY_PART_EXPR = 1 << 1, + REF_BY_VIRTUAL_GEN_COL = 1<< 2, + REF_BY_STORED_GEN_COL = 1 << 3 +}; class ObRawExpr : virtual public jit::expr::ObIRawExpr { public: @@ -1605,7 +1612,7 @@ public: rel_ids_(), inner_alloc_(NULL), expr_factory_(NULL), - is_explicited_reference_(false), + reference_type_(ExplicitedRefType::NONE_REF), ref_count_(0), is_for_generated_column_(false), rt_expr_(NULL), @@ -1624,7 +1631,7 @@ public: rel_ids_(), inner_alloc_(&alloc), expr_factory_(NULL), - is_explicited_reference_(false), + reference_type_(ExplicitedRefType::NONE_REF), ref_count_(0), is_for_generated_column_(false), rt_expr_(NULL), @@ -1763,16 +1770,28 @@ public: inline ObExprInfo &get_flags() { return info_; } int set_enum_set_values(const common::ObIArray &values); const common::ObIArray &get_enum_set_values() const { return enum_set_values_; } - bool is_explicited_reference() const { return is_explicited_reference_; } + bool is_explicited_reference() const { return reference_type_ != ExplicitedRefType::NONE_REF; } + bool is_referred_by_normal() const { return (reference_type_ & ExplicitedRefType::REF_BY_NORMAL) != 0; } + bool is_only_referred_by_stored_gen_col() const { return reference_type_ == ExplicitedRefType::REF_BY_STORED_GEN_COL; } + int32_t get_explicited_reftype() const { return reference_type_; } void set_explicited_reference() { ref_count_++; - is_explicited_reference_ = true; + reference_type_ |= ExplicitedRefType::REF_BY_NORMAL; + } + void set_part_key_reference() { + ref_count_++; + reference_type_ |= ExplicitedRefType::REF_BY_PART_EXPR; + } + void set_explicited_reference(ExplicitedRefType ref_type) + { + ref_count_++; + reference_type_ |= ref_type; } void clear_explicited_referece() { ref_count_ = 0; - is_explicited_reference_ = false; + reference_type_ = ExplicitedRefType::NONE_REF; } int64_t get_ref_count() const { return ref_count_; @@ -1818,7 +1837,7 @@ public: N_EXPR_INFO, info_, N_REL_ID, rel_ids_, K_(enum_set_values), - K_(is_explicited_reference), + K_(reference_type), K_(ref_count), K_(is_for_generated_column), K_(extra), @@ -1850,7 +1869,7 @@ protected: //给user defined function。 common::ObString expr_name_; // for column expr, agg expr, window function expr and query ref exprs - bool is_explicited_reference_; + int32_t reference_type_; int64_t ref_count_; bool is_for_generated_column_; sql::ObExpr *rt_expr_;