Opt cold scan for column store II : prewarm for cg row scanner without filter

This commit is contained in:
DengzhiLiu
2024-01-19 06:42:22 +00:00
committed by ob-robot
parent d29f6ff8a4
commit aadd553fa7
8 changed files with 32 additions and 8 deletions

View File

@ -24,6 +24,7 @@ void ObCGPrefetcher::reset()
query_index_range_.reset();
query_range_.reset();
is_reverse_scan_ = false;
is_project_without_filter_ = false;
cg_iter_type_ = -1;
filter_bitmap_ = nullptr;
micro_data_prewarm_idx_ = 0;
@ -37,6 +38,7 @@ void ObCGPrefetcher::reuse()
ObSSTableIndexFilterFactory::destroy_sstable_index_filter(sstable_index_filter_);
query_index_range_.reset();
query_range_.reset();
is_project_without_filter_ = false;
filter_bitmap_ = nullptr;
micro_data_prewarm_idx_ = 0;
cur_micro_data_read_idx_ = -1;
@ -704,7 +706,8 @@ int ObCGPrefetcher::prewarm()
micro_data_prewarm_idx_ = micro_data_prefetch_idx_;
}
if (is_prefetch_end_ &&
ObICGIterator::OB_CG_SCANNER == cg_iter_type_ &&
(ObICGIterator::OB_CG_SCANNER == cg_iter_type_ ||
(ObICGIterator::OB_CG_ROW_SCANNER == cg_iter_type_ && is_project_without_filter_)) &&
nullptr == cg_agg_cells_ &&
nullptr == access_ctx_->limit_param_ &&
(index_tree_height_ - 1) == cur_level_ &&

View File

@ -23,6 +23,7 @@ class ObCGPrefetcher : public ObIndexTreeMultiPassPrefetcher<>
public:
ObCGPrefetcher() :
is_reverse_scan_(false),
is_project_without_filter_(false),
cg_iter_type_(-1),
query_index_range_(),
query_range_(),
@ -69,7 +70,9 @@ public:
}
void recycle_block_data();
void set_cg_agg_cells(ObCGAggCells &cg_agg_cells) { cg_agg_cells_ = &cg_agg_cells; }
void set_project_type(const bool project_without_filter) { is_project_without_filter_ = project_without_filter; }
INHERIT_TO_STRING_KV("ObCGPrefetcher", ObIndexTreeMultiPassPrefetcher,
K_(is_reverse_scan), K_(is_project_without_filter),
K_(query_index_range), K_(query_range), K_(cg_iter_type),
K_(micro_data_prewarm_idx), K_(cur_micro_data_read_idx), KP_(filter_bitmap),
KP_(cg_agg_cells), KP_(sstable_index_filter));
@ -103,6 +106,7 @@ private:
private:
bool is_reverse_scan_;
bool is_project_without_filter_;
int16_t cg_iter_type_;
ObStorageDatum datums_[2];
ObCSRange query_index_range_;

View File

@ -138,6 +138,8 @@ public:
{ return OB_CG_ROW_SCANNER; }
int get_next_rows(uint64_t &count, const uint64_t capacity, const int64_t datum_offset);
int deep_copy_projected_rows(const int64_t datum_offset, const uint64_t count);
void set_project_type(const bool project_without_filter)
{ return prefetcher_.set_project_type(project_without_filter); }
TO_STRING_KV(K_(is_inited), K_(is_reverse_scan), K_(current),
K_(query_index_range), K_(prefetcher), KP_(filter_bitmap));

View File

@ -23,6 +23,7 @@ namespace storage
int ObCGTileScanner::init(
const ObIArray<ObTableIterParam*> &iter_params,
const bool project_single_row,
const bool project_without_filter,
ObTableAccessContext &access_ctx,
ObITable *table)
{
@ -58,6 +59,8 @@ int ObCGTileScanner::init(
LOG_WARN("Unexpected cg scanner", K(ret), K(cg_scanner->get_type()));
} else if (OB_FAIL(cg_scanners_.push_back(cg_scanner))) {
LOG_WARN("Fail to push back cg scanner", K(ret), K(i), KPC(iter_param));
} else if (ObICGIterator::OB_CG_ROW_SCANNER == cg_scanner->get_type()) {
static_cast<ObCGRowScanner *>(cg_scanner)->set_project_type(project_without_filter);
}
}
if (OB_SUCC(ret)) {
@ -72,6 +75,7 @@ int ObCGTileScanner::init(
int ObCGTileScanner::switch_context(
const ObIArray<ObTableIterParam*> &iter_params,
const bool project_single_row,
const bool project_without_filter,
ObTableAccessContext &access_ctx,
ObITable *table,
const bool col_cnt_changed)
@ -109,6 +113,8 @@ int ObCGTileScanner::switch_context(
} else if (OB_FAIL(cg_scanner->switch_context(
cg_param, access_ctx, cg_wrapper))) {
LOG_WARN("Fail to switch context for cg iter", K(ret));
} else if (ObICGIterator::OB_CG_ROW_SCANNER == cg_scanner->get_type()) {
static_cast<ObCGRowScanner *>(cg_scanner)->set_project_type(project_without_filter);
}
}
}

View File

@ -45,11 +45,13 @@ public:
int init(
const ObIArray<ObTableIterParam*> &iter_params,
const bool project_single_row,
const bool project_without_filter,
ObTableAccessContext &access_ctx,
ObITable *table);
int switch_context(
const ObIArray<ObTableIterParam*> &iter_params,
const bool project_single_row,
const bool project_without_filter,
ObTableAccessContext &access_ctx,
ObITable *table,
const bool col_cnt_changed);

View File

@ -342,14 +342,17 @@ int ObCOSSTableRowScanner::init_project_iter(
LOG_WARN("Failed to cg scan", K(ret));
} else {
project_iter_ = cg_scanner;
if (ObICGIterator::OB_CG_ROW_SCANNER == cg_scanner->get_type()) {
static_cast<ObCGRowScanner *>(cg_scanner)->set_project_type(nullptr == rows_filter_);
}
}
} else if (OB_ISNULL(project_iter_ = OB_NEWx(ObCGTileScanner, context.stmt_allocator_))) {
ret = common::OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Fail to alloc cg tile scanner", K(ret));
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(project_iter_)->init(iter_params, false, context, co_sstable))) {
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(project_iter_)->init(iter_params, false, nullptr == rows_filter_, context, co_sstable))) {
LOG_WARN("Fail to init cg tile scanner", K(ret), K(iter_params));
}
} else if (OB_FAIL(ObCOSSTableRowsFilter::switch_context_for_cg_iter(true, false, co_sstable, context, iter_params,
} else if (OB_FAIL(ObCOSSTableRowsFilter::switch_context_for_cg_iter(true, false, nullptr == rows_filter_, co_sstable, context, iter_params,
column_group_cnt_ != co_sstable->get_cs_meta().get_column_group_count(), project_iter_))) {
LOG_WARN("Fail to switch context for cg iter", K(ret));
}
@ -388,10 +391,10 @@ int ObCOSSTableRowScanner::init_project_iter_for_single_row(
} else if (OB_ISNULL(getter_project_iter_ = OB_NEWx(ObCGTileScanner, context.stmt_allocator_))) {
ret = common::OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Failed to alloc cg tile scanner", K(ret));
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(getter_project_iter_)->init(iter_params, true, context, co_sstable))) {
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(getter_project_iter_)->init(iter_params, true, false, context, co_sstable))) {
LOG_WARN("Failed to init cg tile scanner", K(ret), K(iter_params));
}
} else if (OB_FAIL(ObCOSSTableRowsFilter::switch_context_for_cg_iter(true, true, co_sstable, context, iter_params,
} else if (OB_FAIL(ObCOSSTableRowsFilter::switch_context_for_cg_iter(true, true, false, co_sstable, context, iter_params,
column_group_cnt_ != co_sstable->get_cs_meta().get_column_group_count(), getter_project_iter_))) {
LOG_WARN("Failed to switch context for cg iter", K(ret));
}

View File

@ -138,7 +138,7 @@ int ObCOSSTableRowsFilter::switch_context(
iter_params.reuse();
if (OB_FAIL(construct_cg_iter_params(filter, iter_params))) {
LOG_WARN("Failed to construct cg scan param", K(ret));
} else if (OB_FAIL(switch_context_for_cg_iter(false, false, co_sstable_, context, iter_params, col_cnt_changed, cg_iter))) {
} else if (OB_FAIL(switch_context_for_cg_iter(false, false, true, co_sstable_, context, iter_params, col_cnt_changed, cg_iter))) {
LOG_WARN("Fail to switch context for cg iter", K(ret));
} else if (ObICGIterator::OB_CG_SCANNER == cg_iter->get_type() &&
param.enable_skip_index() &&
@ -408,7 +408,7 @@ int ObCOSSTableRowsFilter::push_cg_iter(
} else if (OB_ISNULL(cg_iter = OB_NEWx(ObCGTileScanner, access_ctx_->stmt_allocator_))) {
ret = common::OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("Fail to alloc cg tile scanner", K(ret));
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(cg_iter)->init(iter_params, false, *access_ctx_, co_sstable_))) {
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(cg_iter)->init(iter_params, false, true, *access_ctx_, co_sstable_))) {
LOG_WARN("Fail to init cg tile scanner", K(ret), K(iter_params));
}
LOG_DEBUG("[COLUMNSTORE] init one cg iter", K(ret), KPC(cg_iter), K(iter_params));
@ -794,6 +794,7 @@ void ObCOSSTableRowsFilter::clear_filter_state(sql::ObPushdownFilterExecutor *fi
int ObCOSSTableRowsFilter::switch_context_for_cg_iter(
const bool is_projector,
const bool project_single_row,
const bool without_filter,
ObCOSSTableV2 *co_sstable,
ObTableAccessContext &context,
common::ObIArray<ObTableIterParam*> &cg_params,
@ -819,12 +820,14 @@ int ObCOSSTableRowsFilter::switch_context_for_cg_iter(
LOG_WARN("Fail to get cg sstable wrapper", K(ret));
} else if (OB_FAIL(cg_iter->switch_context(cg_param, context, cg_wrapper))) {
LOG_WARN("Failed to switch context for project iter", K(ret));
} else if (ObICGIterator::OB_CG_ROW_SCANNER == cg_iter->get_type()) {
static_cast<ObCGRowScanner *>(cg_iter)->set_project_type(is_projector && without_filter);
}
} else if (cg_iter->get_type() != ObICGIterator::OB_CG_TILE_SCANNER) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("Unexpected iter type", K(ret), KPC(cg_iter));
} else if (OB_FAIL(static_cast<ObCGTileScanner*>(cg_iter)->switch_context(
cg_params, project_single_row, context, co_sstable, col_cnt_changed))) {
cg_params, project_single_row, is_projector && without_filter, context, co_sstable, col_cnt_changed))) {
LOG_WARN("Failed to switch context for project iter", K(ret));
}
return ret;

View File

@ -50,6 +50,7 @@ public:
static int switch_context_for_cg_iter(
const bool is_projector,
const bool project_single_row,
const bool without_filter,
ObCOSSTableV2 *co_sstable,
ObTableAccessContext &context,
common::ObIArray<ObTableIterParam*> &cg_params,