Opt cold scan for column store II : prewarm for cg row scanner without filter
This commit is contained in:
@ -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_ &&
|
||||
|
@ -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_;
|
||||
|
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
Reference in New Issue
Block a user