diff --git a/src/sql/optimizer/ob_log_distinct.cpp b/src/sql/optimizer/ob_log_distinct.cpp index 5cd6f740a1..755a605cac 100644 --- a/src/sql/optimizer/ob_log_distinct.cpp +++ b/src/sql/optimizer/ob_log_distinct.cpp @@ -23,6 +23,7 @@ #include "ob_optimizer_util.h" #include "ob_opt_selectivity.h" #include "common/ob_smart_call.h" +#include "sql/rewrite/ob_transform_utils.h" using namespace oceanbase; using namespace sql; @@ -250,7 +251,9 @@ int ObLogDistinct::compute_fd_item_set() LOG_WARN("failed to create fd item set", K(ret)); } else if (OB_FAIL(fd_item_set->assign(child->get_fd_item_set()))) { LOG_WARN("failed to assign fd item set", K(ret)); - } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_table_fd_item(fd_item, + } else if (!ObTransformUtils::need_compute_fd_item_set(distinct_exprs_)) { + //do nothing + }else if (OB_FAIL(my_plan_->get_fd_item_factory().create_table_fd_item(fd_item, true, distinct_exprs_, get_table_set()))) { diff --git a/src/sql/optimizer/ob_log_expr_values.cpp b/src/sql/optimizer/ob_log_expr_values.cpp index fcfca6c7bb..41ed829f97 100644 --- a/src/sql/optimizer/ob_log_expr_values.cpp +++ b/src/sql/optimizer/ob_log_expr_values.cpp @@ -19,6 +19,7 @@ #include "sql/engine/expr/ob_expr_column_conv.h" #include "sql/optimizer/ob_del_upd_log_plan.h" #include "sql/optimizer/ob_join_order.h" +#include "sql/rewrite/ob_transform_utils.h" using namespace oceanbase::common; @@ -127,6 +128,8 @@ int ObLogExprValues::compute_fd_item_set() LOG_WARN("failed to get select exprs", K(ret)); } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_fd_item_set(fd_item_set))) { LOG_WARN("failed to create fd item set", K(ret)); + } else if (!ObTransformUtils::need_compute_fd_item_set(select_exprs)) { + //do nothing } else { for (int64_t i = 0; OB_SUCC(ret) && i < select_exprs.count(); ++i) { ObSEArray value_exprs; diff --git a/src/sql/optimizer/ob_log_group_by.cpp b/src/sql/optimizer/ob_log_group_by.cpp index 888ca151b9..16d0bc9a69 100644 --- a/src/sql/optimizer/ob_log_group_by.cpp +++ b/src/sql/optimizer/ob_log_group_by.cpp @@ -28,6 +28,7 @@ #include "ob_opt_selectivity.h" #include "ob_log_operator_factory.h" #include "sql/optimizer/ob_join_order.h" +#include "sql/rewrite/ob_transform_utils.h" using namespace oceanbase; using namespace sql; @@ -603,6 +604,8 @@ int ObLogGroupBy::compute_fd_item_set() if (get_stmt()->is_select_stmt() && OB_FAIL(create_fd_item_from_select_list(fd_item_set))) { LOG_WARN("failed to create fd item from select list", K(ret)); } + } else if (!ObTransformUtils::need_compute_fd_item_set(group_exprs_)) { + //do nothing } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_table_fd_item( fd_item, true, @@ -635,18 +638,19 @@ int ObLogGroupBy::create_fd_item_from_select_list(ObFdItemSet *fd_item_set) LOG_WARN("get unexpect parameter", K(ret), K(fd_item_set), K(my_plan_), K(get_stmt())); } else if (OB_FAIL(static_cast(get_stmt())->get_select_exprs(select_exprs))) { LOG_WARN("failed to get select exprs", K(ret)); - } - for (int64_t i = 0; OB_SUCC(ret) && i < select_exprs.count(); ++i) { - ObSEArray value_exprs; - if (OB_FAIL(value_exprs.push_back(select_exprs.at(i)))) { - LOG_WARN("failed to push back expr", K(ret)); - } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_table_fd_item(fd_item, - true, - value_exprs, - get_table_set()))) { - LOG_WARN("failed to create fd item", K(ret)); - } else if (OB_FAIL(fd_item_set->push_back(fd_item))) { - LOG_WARN("failed to push back fd item", K(ret)); + } else if (ObTransformUtils::need_compute_fd_item_set(select_exprs)) { + for (int64_t i = 0; OB_SUCC(ret) && i < select_exprs.count(); ++i) { + ObSEArray value_exprs; + if (OB_FAIL(value_exprs.push_back(select_exprs.at(i)))) { + LOG_WARN("failed to push back expr", K(ret)); + } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_table_fd_item(fd_item, + true, + value_exprs, + get_table_set()))) { + LOG_WARN("failed to create fd item", K(ret)); + } else if (OB_FAIL(fd_item_set->push_back(fd_item))) { + LOG_WARN("failed to push back fd item", K(ret)); + } } } return ret; diff --git a/src/sql/optimizer/ob_log_set.cpp b/src/sql/optimizer/ob_log_set.cpp index a0affc156d..d3769a4bd9 100644 --- a/src/sql/optimizer/ob_log_set.cpp +++ b/src/sql/optimizer/ob_log_set.cpp @@ -208,18 +208,20 @@ int ObLogSet::compute_fd_item_set() LOG_WARN("failed to create fd item set", K(ret)); } else if (OB_FAIL(get_set_exprs(select_exprs))) { LOG_WARN("failed to get set exprs", K(ret)); + } else if (!ObTransformUtils::need_compute_fd_item_set(select_exprs)) { + //do nothing } else if (OB_FAIL(my_plan_->get_fd_item_factory().create_expr_fd_item( - fd_item, - true, - select_exprs, - select_exprs))) { + fd_item, + true, + select_exprs, + select_exprs))) { } else if (OB_FAIL(fd_item_set->push_back(fd_item))) { LOG_WARN("failed to push back fd item", K(ret)); } else if ((ObSelectStmt::INTERSECT == set_op_ || ObSelectStmt::EXCEPT == set_op_) && - OB_FAIL(append(*fd_item_set, left_child->get_fd_item_set()))) { + OB_FAIL(append(*fd_item_set, left_child->get_fd_item_set()))) { LOG_WARN("failed to append fd item set", K(ret)); } else if (ObSelectStmt::INTERSECT == set_op_ && - OB_FAIL(append(*fd_item_set, right_child->get_fd_item_set()))) { + OB_FAIL(append(*fd_item_set, right_child->get_fd_item_set()))) { LOG_WARN("failed to append fd item set", K(ret)); } else if (OB_FAIL(deduce_const_exprs_and_ft_item_set(*fd_item_set))) { LOG_WARN("falied to deduce fd item set", K(ret)); diff --git a/src/sql/optimizer/ob_optimizer_util.cpp b/src/sql/optimizer/ob_optimizer_util.cpp index d1b0415731..f64cea7916 100644 --- a/src/sql/optimizer/ob_optimizer_util.cpp +++ b/src/sql/optimizer/ob_optimizer_util.cpp @@ -3401,22 +3401,24 @@ int ObOptimizerUtil::try_add_fd_item(const ObDMLStmt *stmt, contain_not_null = true; } } - if (OB_SUCC(ret) && all_columns_used && unique_exprs.count() > 0) { - ObTableFdItem *fd_item = NULL; - if (OB_FAIL(fd_factory.create_table_fd_item(fd_item, true, unique_exprs, tables))) { - LOG_WARN("failed to create fd item", K(ret)); - } else if (all_not_null || - (lib::is_oracle_mode() && contain_not_null) || - index_schema->get_table_id() == table->ref_id_) { - // 1. 在oracle中, unique index (c1,c2) 允许存在多个 (null, null), 但不允许存在多个 (1, null), - // 因此oracle模式下只要unique index中有一列是not null的, 该index中就不存在重复的值 - // 2. the primary index must be unique even if a partition table may have a nullable part-key - // wihch is a part of the primary key. - if (OB_FAIL(fd_item_set.push_back(fd_item))) { + if (OB_SUCC(ret) && ObTransformUtils::need_compute_fd_item_set(unique_exprs)) { + if (OB_SUCC(ret) && all_columns_used && unique_exprs.count() > 0) { + ObTableFdItem *fd_item = NULL; + if (OB_FAIL(fd_factory.create_table_fd_item(fd_item, true, unique_exprs, tables))) { + LOG_WARN("failed to create fd item", K(ret)); + } else if (all_not_null || + (lib::is_oracle_mode() && contain_not_null) || + index_schema->get_table_id() == table->ref_id_) { + // 1. 在oracle中, unique index (c1,c2) 允许存在多个 (null, null), 但不允许存在多个 (1, null), + // 因此oracle模式下只要unique index中有一列是not null的, 该index中就不存在重复的值 + // 2. the primary index must be unique even if a partition table may have a nullable part-key + // wihch is a part of the primary key. + if (OB_FAIL(fd_item_set.push_back(fd_item))) { + LOG_WARN("failed to push back fd item", K(ret)); + } + } else if (OB_FAIL(candi_fd_item_set.push_back(fd_item))) { LOG_WARN("failed to push back fd item", K(ret)); } - } else if (OB_FAIL(candi_fd_item_set.push_back(fd_item))) { - LOG_WARN("failed to push back fd item", K(ret)); } } } diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index 83e2adb10a..62dd1318a3 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -4676,6 +4676,14 @@ int ObTransformUtils::compute_basic_table_property(const ObDMLStmt *stmt, return ret; } +int ObTransformUtils::need_compute_fd_item_set(ObIArray &exprs) +{ + bool need = true; + if (exprs.count() > 128) { + need = false; + } + return need; +} //extract rowid in select_exprs //add table fd for related table. int ObTransformUtils::try_add_table_fd_for_rowid(const ObSelectStmt *stmt, diff --git a/src/sql/rewrite/ob_transform_utils.h b/src/sql/rewrite/ob_transform_utils.h index a4f3e6ab5e..4433579c0b 100644 --- a/src/sql/rewrite/ob_transform_utils.h +++ b/src/sql/rewrite/ob_transform_utils.h @@ -859,7 +859,7 @@ public: const TableItem *table, ObIArray &cond_exprs, UniqueCheckInfo &res_info); - + static int need_compute_fd_item_set(ObIArray &exprs); static int try_add_table_fd_for_rowid(const ObSelectStmt *stmt, ObFdItemFactory &fd_factory, ObIArray &fd_item_set,