From 31d0d378704f9e5f0b4caecc09a174343de7051b Mon Sep 17 00:00:00 2001 From: XIAO-HOU <372060054@qq.com> Date: Tue, 3 Sep 2024 17:12:31 +0000 Subject: [PATCH] Disable group by more than one column pushdown temporarily --- .../access/ob_pushdown_aggregate_vec.cpp | 4 +- src/storage/access/ob_vector_store.cpp | 53 ++++++++++++++++++- src/storage/access/ob_vector_store.h | 2 + 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/storage/access/ob_pushdown_aggregate_vec.cpp b/src/storage/access/ob_pushdown_aggregate_vec.cpp index fd7efec64..b7be0d008 100644 --- a/src/storage/access/ob_pushdown_aggregate_vec.cpp +++ b/src/storage/access/ob_pushdown_aggregate_vec.cpp @@ -899,8 +899,8 @@ int ObGroupByCellVec::init(const ObTableAccessParam ¶m, const ObTableAccessC null_datum.set_null(); for (int64_t i = 0; OB_SUCC(ret) && i < param.output_exprs_->count(); ++i) { if (T_PSEUDO_GROUP_ID == param.output_exprs_->at(i)->type_) { - ret = OB_INVALID_ARGUMENT; - LOG_WARN("Unexpected group idx expr", K(ret), KPC(param.output_exprs_->at(i))); + LOG_TRACE("Group by pushdown in batch nlj", K(ret)); + continue; } else if (nullptr == param.output_sel_mask_ || param.output_sel_mask_->at(i)) { int32_t col_offset = param.iter_param_.out_cols_project_->at(i); sql::ObExpr *expr = param.output_exprs_->at(i); diff --git a/src/storage/access/ob_vector_store.cpp b/src/storage/access/ob_vector_store.cpp index 2ae0db0a6..be8217f6c 100644 --- a/src/storage/access/ob_vector_store.cpp +++ b/src/storage/access/ob_vector_store.cpp @@ -40,7 +40,8 @@ ObVectorStore::ObVectorStore( default_row_(), group_by_cell_(nullptr), iter_param_(nullptr), - skip_bit_(skip_bit) + skip_bit_(skip_bit), + need_check_group_by_(false) {} ObVectorStore::~ObVectorStore() @@ -65,6 +66,7 @@ void ObVectorStore::reset() context_.stmt_allocator_->free(group_by_cell_); group_by_cell_ = nullptr; } + need_check_group_by_ = false; } int ObVectorStore::init(const ObTableAccessParam ¶m, common::hash::ObHashSet *agg_col_mask) @@ -192,6 +194,50 @@ int ObVectorStore::check_agg_mask( return ret; } +int ObVectorStore::check_need_group_by(const ObTableAccessParam ¶m) +{ + int ret = OB_SUCCESS; + if (OB_UNLIKELY(nullptr == param.output_exprs_ || + nullptr == param.iter_param_.group_by_cols_project_ || + 0 == param.iter_param_.group_by_cols_project_->count())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("Invalid argument", K(ret), K(param)); + } else { + need_check_group_by_ = true; + ObMemAttr attr(MTL_ID(), common::ObModIds::OB_HASH_BUCKET); + common::hash::ObHashSet col_offset_set; + const int32_t group_by_col_offset = param.iter_param_.group_by_cols_project_->at(0); + const int32_t agg_expr_cnt = nullptr == param.aggregate_exprs_ ? 0 : param.aggregate_exprs_->count(); + if (OB_FAIL(col_offset_set.create((agg_expr_cnt + 1) * 2, attr))) { + LOG_WARN("Failed to create column offset set", K(ret), K(agg_expr_cnt)); + } + for (int64_t i = 0; OB_SUCC(ret) && i < agg_expr_cnt; ++i) { + int32_t col_offset = param.iter_param_.agg_cols_project_->at(i); + if (OB_FAIL(col_offset_set.set_refactored(col_offset, 0/*deduplicated*/))) { + LOG_WARN("Failed to add column offset", K(ret), K(i), K(col_offset)); + } + } + for (int64_t i = 0; OB_SUCC(ret) && need_check_group_by_ && i < param.output_exprs_->count(); ++i) { + if (T_PSEUDO_GROUP_ID == param.output_exprs_->at(i)->type_) { + } else if (nullptr == param.output_sel_mask_ || param.output_sel_mask_->at(i)) { + int32_t col_offset = param.iter_param_.out_cols_project_->at(i); + if (group_by_col_offset != col_offset) { + ret = col_offset_set.exist_refactored(col_offset); + if (OB_HASH_EXIST == ret) { + ret = OB_SUCCESS; + } else if (OB_HASH_NOT_EXIST == ret) { + need_check_group_by_ = false; + ret = OB_SUCCESS; + } else { + LOG_WARN("Failed to search in hashset", K(ret), K(col_offset)); + } + } + } + } + } + return ret; +} + int ObVectorStore::alloc_group_by_cell(const ObTableAccessParam ¶m) { int ret = OB_SUCCESS; @@ -214,6 +260,9 @@ int ObVectorStore::alloc_group_by_cell(const ObTableAccessParam ¶m) LOG_WARN("Failed to init group by cell", K(ret)); } } + if (OB_SUCC(ret) && check_need_group_by(param)) { + LOG_WARN("Failed to check need group by", K(ret), K(param)); + } } return ret; } @@ -274,7 +323,7 @@ int ObVectorStore::fill_rows( ret = OB_ERR_UNEXPECTED; LOG_WARN("Unexpected vector store count", K(ret), K_(count), KP_(group_by_cell)); } else if (FALSE_IT(reader = scanner.get_reader())) { - } else if (OB_FAIL(check_can_group_by(reader, begin_index, end_index, res, can_group_by))) { + } else if (need_check_group_by_ && OB_FAIL(check_can_group_by(reader, begin_index, end_index, res, can_group_by))) { LOG_WARN("Failed to checkout pushdown group by", K(ret)); } else if (can_group_by) { if (OB_FAIL(fill_group_by_rows(group_idx, reader, begin_index, end_index, res))) { diff --git a/src/storage/access/ob_vector_store.h b/src/storage/access/ob_vector_store.h index c7d2940b9..1ac065811 100644 --- a/src/storage/access/ob_vector_store.h +++ b/src/storage/access/ob_vector_store.h @@ -95,6 +95,7 @@ protected: common::hash::ObHashSet *agg_col_mask, bool &is_agg_mask) const; int alloc_group_by_cell(const ObTableAccessParam ¶m); + int check_need_group_by(const ObTableAccessParam ¶m); int64_t count_; // exprs needed fill in @@ -107,6 +108,7 @@ protected: ObGroupByCellBase *group_by_cell_; const ObTableIterParam *iter_param_; sql::ObBitVector *skip_bit_; + bool need_check_group_by_; }; }