add limit to solve slow compute_fd_item
This commit is contained in:
		@ -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()))) {
 | 
			
		||||
 | 
			
		||||
@ -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<ObRawExpr *, 1> value_exprs;
 | 
			
		||||
 | 
			
		||||
@ -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<const ObSelectStmt *>(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<ObRawExpr *, 1> 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<ObRawExpr *, 1> 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;
 | 
			
		||||
 | 
			
		||||
@ -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));
 | 
			
		||||
 | 
			
		||||
@ -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));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user