[FEAT MERGE] skip scan feature and performance optimization

This commit is contained in:
obdev
2023-01-04 09:08:22 +00:00
committed by ob-robot
parent ad415b4359
commit 07b1224a51
119 changed files with 6176 additions and 2010 deletions

View File

@ -237,6 +237,7 @@ void ObTableScanOpInput::reset()
{
tablet_loc_ = nullptr;
key_ranges_.reset();
ss_key_ranges_.reset();
mbr_filters_.reset();
range_array_pos_.reset();
not_need_extract_query_range_ = false;
@ -247,7 +248,8 @@ OB_DEF_SERIALIZE_SIZE(ObTableScanOpInput)
int len = 0;
LST_DO_CODE(OB_UNIS_ADD_LEN,
key_ranges_,
not_need_extract_query_range_);
not_need_extract_query_range_,
ss_key_ranges_);
return len;
}
@ -256,7 +258,8 @@ OB_DEF_SERIALIZE(ObTableScanOpInput)
int ret = OB_SUCCESS;
LST_DO_CODE(OB_UNIS_ENCODE,
key_ranges_,
not_need_extract_query_range_);
not_need_extract_query_range_,
ss_key_ranges_);
return ret;
}
@ -274,6 +277,18 @@ OB_DEF_DESERIALIZE(ObTableScanOpInput)
exec_ctx_.get_allocator(), buf, data_len, pos))) {
LOG_WARN("range deserialize failed", K(ret));
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(serialization::decode_vi64(buf, data_len, pos, &cnt))) {
LOG_WARN("decode failed", K(ret));
} else if (OB_FAIL(ss_key_ranges_.prepare_allocate(cnt))) {
LOG_WARN("array prepare allocate failed", K(ret));
}
for (int64_t i = 0; OB_SUCC(ret) && i < cnt; i++) {
if (OB_FAIL(ss_key_ranges_.at(i).deserialize(exec_ctx_.get_allocator(),
buf, data_len, pos))) {
LOG_WARN("range deserialize failed", K(ret));
}
}
}
if (OB_SUCC(ret)) {
LST_DO_CODE(OB_UNIS_DECODE, not_need_extract_query_range_);
@ -761,6 +776,7 @@ int ObTableScanOp::prepare_all_das_tasks()
LOG_WARN("prepare das task failed", K(ret));
} else {
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
}
}
}
@ -962,7 +978,7 @@ int ObTableScanOp::prepare_batch_scan_range()
LOG_WARN("prepare single scan range failed", K(ret));
}
}
LOG_DEBUG("after prepare batch scan range", K(MY_INPUT.key_ranges_));
LOG_DEBUG("after prepare batch scan range", K(MY_INPUT.key_ranges_), K(MY_INPUT.ss_key_ranges_));
return ret;
}
@ -996,6 +1012,7 @@ int ObTableScanOp::prepare_single_scan_range(int64_t group_idx)
{
int ret = OB_SUCCESS;
ObQueryRangeArray key_ranges;
ObQueryRangeArray ss_key_ranges;
ObGetMethodArray get_method;
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_);
ObIAllocator &range_allocator = (table_rescan_allocator_ != nullptr ?
@ -1039,20 +1056,51 @@ int ObTableScanOp::prepare_single_scan_range(int64_t group_idx)
get_method,
ObBasicSessionInfo::create_dtc_params(ctx_.get_my_session())))) {
LOG_WARN("failed to extract pre query ranges", K(ret));
} else if (OB_FAIL(MY_CTDEF.pre_query_range_.get_ss_tablet_ranges(range_allocator,
ctx_,
ss_key_ranges,
ObBasicSessionInfo::create_dtc_params(ctx_.get_my_session())))) {
LOG_WARN("failed to final extract index skip query range", K(ret));
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < key_ranges.count(); ++i) {
ObNewRange *key_range = key_ranges.at(i);
key_range->table_id_ = MY_CTDEF.scan_ctdef_.ref_table_id_;
key_range->group_idx_ = group_idx;
if (OB_FAIL(MY_INPUT.key_ranges_.push_back(*key_range))) {
LOG_WARN("store key range in TSC input failed", K(ret));
if (OB_FAIL(ret)) {
} else if (!ss_key_ranges.empty()) {
// index skip scan, ranges from extract_pre_query_range/get_ss_tablet_ranges,
// prefix range and postfix range is single range
if (1 != ss_key_ranges.count() || 1 != key_ranges.count()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected index skip scan range", K(ret), K(key_ranges), K(ss_key_ranges));
} else {
key_ranges.at(0)->table_id_ = MY_CTDEF.scan_ctdef_.ref_table_id_;
key_ranges.at(0)->group_idx_ = group_idx;
ss_key_ranges.at(0)->table_id_ = MY_CTDEF.scan_ctdef_.ref_table_id_;
ss_key_ranges.at(0)->group_idx_ = group_idx;
if (OB_FAIL(MY_INPUT.key_ranges_.push_back(*key_ranges.at(0)))
|| OB_FAIL(MY_INPUT.ss_key_ranges_.push_back(*ss_key_ranges.at(0)))) {
LOG_WARN("store key range in TSC input failed", K(ret));
}
}
} else {
ObNewRange whole_range;
ObNewRange *key_range = NULL;
whole_range.set_whole_range();
whole_range.table_id_ = MY_CTDEF.scan_ctdef_.ref_table_id_;
whole_range.group_idx_ = group_idx;
for (int64_t i = 0; OB_SUCC(ret) && i < key_ranges.count(); ++i) {
key_range = key_ranges.at(i);
key_range->table_id_ = MY_CTDEF.scan_ctdef_.ref_table_id_;
key_range->group_idx_ = group_idx;
if (OB_FAIL(MY_INPUT.key_ranges_.push_back(*key_range))
|| OB_FAIL(MY_INPUT.ss_key_ranges_.push_back(whole_range))) {
LOG_WARN("store key range in TSC input failed", K(ret));
}
}
}
if (OB_SUCC(ret) && MY_SPEC.is_vt_mapping_) {
OZ(OB_FAIL(vt_result_converter_->convert_key_ranges(MY_INPUT.key_ranges_)));
}
LOG_TRACE("prepare single scan range", K(ret), K(key_ranges), K(MY_INPUT.key_ranges_));
LOG_TRACE("prepare single scan range", K(ret), K(key_ranges), K(MY_INPUT.key_ranges_),
K(MY_INPUT.ss_key_ranges_));
return ret;
}
@ -1338,6 +1386,7 @@ int ObTableScanOp::inner_rescan()
output_row_cnt_ = 0;
iter_end_ = false;
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
MY_INPUT.mbr_filters_.reuse();
if (OB_FAIL(ObOperator::inner_rescan())) {
LOG_WARN("rescan operator failed", K(ret));
@ -1381,6 +1430,7 @@ int ObTableScanOp::close_and_reopen()
tsc_rtdef_.lookup_rtdef_->stmt_allocator_.set_alloc(&das_ref_.get_das_alloc());
}
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
MY_INPUT.mbr_filters_.reuse();
}
return ret;
@ -1460,6 +1510,7 @@ int ObTableScanOp::local_iter_reuse()
} else {
tsc_rtdef_.scan_rtdef_.scan_allocator_.set_alloc(table_rescan_allocator_);
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
MY_INPUT.mbr_filters_.reuse();
}
return ret;
@ -1833,13 +1884,19 @@ int ObTableScanOp::cherry_pick_range_by_tablet_id(ObDASScanOp *scan_op)
{
int ret = OB_SUCCESS;
ObIArray<ObNewRange> &scan_ranges = scan_op->get_scan_param().key_ranges_;
ObIArray<ObNewRange> &ss_ranges = scan_op->get_scan_param().ss_key_ranges_;
ObIArray<ObSpatialMBR> &mbr_filters = scan_op->get_scan_param().mbr_filters_;
const ObIArray<ObNewRange> &input_ranges = MY_INPUT.key_ranges_;
const ObIArray<ObNewRange> &input_ss_ranges = MY_INPUT.ss_key_ranges_;
const ObIArray<ObSpatialMBR> &input_filters = MY_INPUT.mbr_filters_;
ObDASGroupScanOp *batch_op = DAS_GROUP_SCAN_OP(scan_op);
bool add_all = false;
bool prune_all = true;
if (ObPartitionLevel::PARTITION_LEVEL_MAX == MY_SPEC.part_level_
if (OB_UNLIKELY(input_ranges.count() != input_ss_ranges.count())) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("ranges and skip scan postfix ranges mismatch", K(ret), K(input_ranges.count()),
K(input_ss_ranges.count()));
} else if (ObPartitionLevel::PARTITION_LEVEL_MAX == MY_SPEC.part_level_
|| ObPartitionLevel::PARTITION_LEVEL_ZERO == MY_SPEC.part_level_
|| (input_ranges.count() <= 1)) {
add_all = true;
@ -1857,6 +1914,8 @@ int ObTableScanOp::cherry_pick_range_by_tablet_id(ObDASScanOp *scan_op)
prune_all = false;
if (OB_FAIL(scan_ranges.push_back(input_ranges.at(i)))) {
LOG_WARN("store input range to scan param failed", K(ret));
} else if (OB_FAIL(ss_ranges.push_back(input_ss_ranges.at(i)))) {
LOG_WARN("store input skip scan range to scan param failed", K(ret));
} else if (!input_ranges.at(i).is_physical_rowid_range_) {
//do nothing
} else if (OB_UNLIKELY(MY_SPEC.get_columns_desc().count() < 1)) {
@ -1885,15 +1944,20 @@ int ObTableScanOp::cherry_pick_range_by_tablet_id(ObDASScanOp *scan_op)
}
if (OB_SUCC(ret) && prune_all && !input_ranges.empty()) {
ObNewRange false_range;
ObNewRange whole_range;
false_range.set_false_range();
false_range.group_idx_ = input_ranges.at(0).group_idx_;
whole_range.set_whole_range();
if (OB_FAIL(scan_ranges.push_back(false_range))) {
LOG_WARN("store false range to scan ranges failed", K(ret));
} else if (OB_FAIL(ss_ranges.push_back(whole_range))) {
LOG_WARN("store whole range to skip scan ranges failed", K(ret));
}
}
if (OB_SUCC(ret)) {
LOG_DEBUG("range after pruning", K(input_ranges), K(scan_ranges), K_(group_size),
"tablet_id", scan_op->get_tablet_id());
"tablet_id", scan_op->get_tablet_id(),
K(input_ss_ranges), K(ss_ranges));
}
return ret;
}
@ -2057,9 +2121,11 @@ int ObTableScanOp::reassign_task_ranges(ObGranuleTaskInfo &info)
if (MY_SPEC.gi_above_ && !iter_end_) {
if (OB_UNLIKELY(MY_SPEC.get_query_range().is_contain_geo_filters())) {
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
MY_INPUT.mbr_filters_.reuse();
} else if (!MY_INPUT.get_need_extract_query_range()) {
if (OB_FAIL(MY_INPUT.key_ranges_.assign(info.ranges_))) {
if (OB_FAIL(MY_INPUT.key_ranges_.assign(info.ranges_)) ||
OB_FAIL(MY_INPUT.ss_key_ranges_.assign(info.ss_ranges_))) {
LOG_WARN("assign the range info failed", K(ret), K(info));
} else if (MY_SPEC.is_vt_mapping_) {
if (OB_FAIL(vt_result_converter_->convert_key_ranges(MY_INPUT.key_ranges_))) {
@ -2069,6 +2135,7 @@ int ObTableScanOp::reassign_task_ranges(ObGranuleTaskInfo &info)
} else {
// use prepare() to set key ranges if px do not extract query range
MY_INPUT.key_ranges_.reuse();
MY_INPUT.ss_key_ranges_.reuse();
MY_INPUT.mbr_filters_.reuse();
LOG_DEBUG("do prepare!!!");
}