Skip to content

Commit 0a31dc3

Browse files
Merge branch 'apache:master' into sss
2 parents bcb6299 + 0ab4eae commit 0a31dc3

File tree

71 files changed

+943
-295
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+943
-295
lines changed

.asf.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ github:
6363
- COMPILE (DORIS_COMPILE)
6464
- Need_2_Approval
6565
- Cloud UT (Doris Cloud UT)
66+
- performance (Doris Performance)
6667

6768
required_pull_request_reviews:
6869
dismiss_stale_reviews: true

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,9 @@ Apache Doris is an easy-to-use, high-performance and real-time analytical databa
5959

6060
All this makes Apache Doris an ideal tool for scenarios including report analysis, ad-hoc query, unified data warehouse, and data lake query acceleration. On Apache Doris, users can build various applications, such as user behavior analysis, AB test platform, log retrieval analysis, user portrait analysis, and order analysis.
6161

62-
🎉 Version 2.1.4 released now. Check out the 🔗[Release Notes](https://doris.apache.org/docs/releasenotes/release-2.1.4) here. The 2.1 verison delivers exceptional performance with 100% higher out-of-the-box queries proven by TPC-DS 1TB tests, enhanced data lake analytics that are 4-6 times speedier than Trino and Spark, solid support for semi-structured data analysis with new Variant types and suite of analytical functions, asynchronous materialized views for query acceleration, optimized real-time writing at scale, and better workload management with stability and runtime SQL resource tracking.
62+
🎉 Check out the 🔗[All releases](https://doris.apache.org/docs/releasenotes/all-release), where you'll find a chronological summary of Apache Doris versions released over the past year.
6363

64-
65-
🎉 Version 2.0.12 is now released ! This fully evolved and stable release is ready for all users to upgrade. Check out the 🔗[Release Notes](https://doris.apache.org/docs/2.0/releasenotes/release-2.0.12) here.
66-
67-
👀 Have a look at the 🔗[Official Website](https://doris.apache.org/) for a comprehensive list of Apache Doris's core features, blogs and user cases.
64+
👀 Explore the 🔗[Official Website](https://doris.apache.org/) to discover Apache Doris's core features, blogs, and user cases in detail.
6865

6966
## 📈 Usage Scenarios
7067

be/src/olap/base_tablet.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "common/status.h"
2929
#include "olap/calc_delete_bitmap_executor.h"
3030
#include "olap/delete_bitmap_calculator.h"
31+
#include "olap/iterators.h"
3132
#include "olap/memtable.h"
3233
#include "olap/partial_update_info.h"
3334
#include "olap/primary_key_index.h"
@@ -81,7 +82,9 @@ Status _get_segment_column_iterator(const BetaRowsetSharedPtr& rowset, uint32_t
8182
rowset->rowset_id().to_string(), segid));
8283
}
8384
segment_v2::SegmentSharedPtr segment = *it;
84-
RETURN_IF_ERROR(segment->new_column_iterator(target_column, column_iterator, nullptr));
85+
StorageReadOptions opts;
86+
opts.stats = stats;
87+
RETURN_IF_ERROR(segment->new_column_iterator(target_column, column_iterator, &opts));
8588
segment_v2::ColumnIteratorOptions opt {
8689
.use_page_cache = !config::disable_storage_page_cache,
8790
.file_reader = segment->file_reader().get(),
@@ -496,7 +499,7 @@ Status BaseTablet::lookup_row_key(const Slice& encoded_key, TabletSchema* latest
496499

497500
for (auto id : picked_segments) {
498501
Status s = segments[id]->lookup_row_key(encoded_key, schema, with_seq_col, with_rowid,
499-
&loc, encoded_seq_value, stats);
502+
&loc, stats, encoded_seq_value);
500503
if (s.is<KEY_NOT_FOUND>()) {
501504
continue;
502505
}
@@ -612,7 +615,7 @@ Status BaseTablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
612615
vectorized::Block ordered_block = block.clone_empty();
613616
uint32_t pos = 0;
614617

615-
RETURN_IF_ERROR(seg->load_pk_index_and_bf()); // We need index blocks to iterate
618+
RETURN_IF_ERROR(seg->load_pk_index_and_bf(nullptr)); // We need index blocks to iterate
616619
const auto* pk_idx = seg->get_primary_key_index();
617620
int total = pk_idx->num_rows();
618621
uint32_t row_id = 0;
@@ -626,7 +629,7 @@ Status BaseTablet::calc_segment_delete_bitmap(RowsetSharedPtr rowset,
626629
std::vector<std::unique_ptr<SegmentCacheHandle>> segment_caches(specified_rowsets.size());
627630
while (remaining > 0) {
628631
std::unique_ptr<segment_v2::IndexedColumnIterator> iter;
629-
RETURN_IF_ERROR(pk_idx->new_iterator(&iter));
632+
RETURN_IF_ERROR(pk_idx->new_iterator(&iter, nullptr));
630633

631634
size_t num_to_read = std::min(batch_size, remaining);
632635
auto index_type = vectorized::DataTypeFactory::instance().create_data_type(

be/src/olap/delete_bitmap_calculator.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,12 +145,11 @@ Status MergeIndexDeleteBitmapCalculator::init(RowsetId rowset_id,
145145
MergeIndexDeleteBitmapCalculatorContext::Comparator(seq_col_length, _rowid_length);
146146
_contexts.reserve(segments.size());
147147
_heap = std::make_unique<Heap>(_comparator);
148-
149148
for (auto& segment : segments) {
150-
RETURN_IF_ERROR(segment->load_index());
149+
RETURN_IF_ERROR(segment->load_index(nullptr));
151150
auto pk_idx = segment->get_primary_key_index();
152151
std::unique_ptr<segment_v2::IndexedColumnIterator> index;
153-
RETURN_IF_ERROR(pk_idx->new_iterator(&index));
152+
RETURN_IF_ERROR(pk_idx->new_iterator(&index, nullptr));
154153
auto index_type = vectorized::DataTypeFactory::instance().create_data_type(
155154
pk_idx->type_info()->type(), 1, 0);
156155
_contexts.emplace_back(std::move(index), index_type, segment->id(), pk_idx->num_rows());

be/src/olap/olap_common.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,30 @@ struct OlapReaderStatistics {
389389
int64_t collect_iterator_merge_next_timer = 0;
390390
int64_t collect_iterator_normal_next_timer = 0;
391391
int64_t delete_bitmap_get_agg_ns = 0;
392+
393+
int64_t tablet_reader_init_timer_ns = 0;
394+
int64_t tablet_reader_capture_rs_readers_timer_ns = 0;
395+
int64_t tablet_reader_init_return_columns_timer_ns = 0;
396+
int64_t tablet_reader_init_keys_param_timer_ns = 0;
397+
int64_t tablet_reader_init_orderby_keys_param_timer_ns = 0;
398+
int64_t tablet_reader_init_conditions_param_timer_ns = 0;
399+
int64_t tablet_reader_init_delete_condition_param_timer_ns = 0;
400+
int64_t block_reader_vcollect_iter_init_timer_ns = 0;
401+
int64_t block_reader_rs_readers_init_timer_ns = 0;
402+
int64_t block_reader_build_heap_init_timer_ns = 0;
403+
404+
int64_t rowset_reader_get_segment_iterators_timer_ns = 0;
405+
int64_t rowset_reader_create_iterators_timer_ns = 0;
406+
int64_t rowset_reader_init_iterators_timer_ns = 0;
407+
int64_t rowset_reader_load_segments_timer_ns = 0;
408+
409+
int64_t segment_iterator_init_timer_ns = 0;
410+
int64_t segment_iterator_init_return_column_iterators_timer_ns = 0;
411+
int64_t segment_iterator_init_bitmap_index_iterators_timer_ns = 0;
412+
int64_t segment_iterator_init_inverted_index_iterators_timer_ns = 0;
413+
414+
int64_t segment_create_column_readers_timer_ns = 0;
415+
int64_t segment_load_index_timer_ns = 0;
392416
};
393417

394418
using ColumnId = uint32_t;

be/src/olap/primary_key_index.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,27 +95,29 @@ Status PrimaryKeyIndexBuilder::finalize(segment_v2::PrimaryKeyIndexMetaPB* meta)
9595
}
9696

9797
Status PrimaryKeyIndexReader::parse_index(io::FileReaderSPtr file_reader,
98-
const segment_v2::PrimaryKeyIndexMetaPB& meta) {
98+
const segment_v2::PrimaryKeyIndexMetaPB& meta,
99+
OlapReaderStatistics* pk_index_load_stats) {
99100
// parse primary key index
100101
_index_reader.reset(new segment_v2::IndexedColumnReader(file_reader, meta.primary_key_index()));
101102
_index_reader->set_is_pk_index(true);
102103
RETURN_IF_ERROR(_index_reader->load(!config::disable_pk_storage_page_cache, false,
103-
_pk_index_load_stats));
104+
pk_index_load_stats));
104105

105106
_index_parsed = true;
106107
return Status::OK();
107108
}
108109

109110
Status PrimaryKeyIndexReader::parse_bf(io::FileReaderSPtr file_reader,
110-
const segment_v2::PrimaryKeyIndexMetaPB& meta) {
111+
const segment_v2::PrimaryKeyIndexMetaPB& meta,
112+
OlapReaderStatistics* pk_index_load_stats) {
111113
// parse bloom filter
112114
segment_v2::ColumnIndexMetaPB column_index_meta = meta.bloom_filter_index();
113115
segment_v2::BloomFilterIndexReader bf_index_reader(std::move(file_reader),
114116
column_index_meta.bloom_filter_index());
115117
RETURN_IF_ERROR(bf_index_reader.load(!config::disable_pk_storage_page_cache, false,
116-
_pk_index_load_stats));
118+
pk_index_load_stats));
117119
std::unique_ptr<segment_v2::BloomFilterIndexIterator> bf_iter;
118-
RETURN_IF_ERROR(bf_index_reader.new_iterator(&bf_iter));
120+
RETURN_IF_ERROR(bf_index_reader.new_iterator(&bf_iter, pk_index_load_stats));
119121
RETURN_IF_ERROR(bf_iter->read_bloom_filter(0, &_bf));
120122
segment_v2::g_pk_total_bloom_filter_num << 1;
121123
segment_v2::g_pk_total_bloom_filter_total_bytes << _bf->size();

be/src/olap/primary_key_index.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,7 @@ class PrimaryKeyIndexBuilder {
9898

9999
class PrimaryKeyIndexReader {
100100
public:
101-
PrimaryKeyIndexReader(OlapReaderStatistics* pk_index_load_stats = nullptr)
102-
: _index_parsed(false), _bf_parsed(false), _pk_index_load_stats(pk_index_load_stats) {}
101+
PrimaryKeyIndexReader() : _index_parsed(false), _bf_parsed(false) {}
103102

104103
~PrimaryKeyIndexReader() {
105104
segment_v2::g_pk_total_bloom_filter_num << -static_cast<int64_t>(_bf_num);
@@ -109,12 +108,14 @@ class PrimaryKeyIndexReader {
109108
}
110109

111110
Status parse_index(io::FileReaderSPtr file_reader,
112-
const segment_v2::PrimaryKeyIndexMetaPB& meta);
111+
const segment_v2::PrimaryKeyIndexMetaPB& meta,
112+
OlapReaderStatistics* pk_index_load_stats);
113113

114-
Status parse_bf(io::FileReaderSPtr file_reader, const segment_v2::PrimaryKeyIndexMetaPB& meta);
114+
Status parse_bf(io::FileReaderSPtr file_reader, const segment_v2::PrimaryKeyIndexMetaPB& meta,
115+
OlapReaderStatistics* pk_index_load_stats);
115116

116117
Status new_iterator(std::unique_ptr<segment_v2::IndexedColumnIterator>* index_iterator,
117-
OlapReaderStatistics* stats = nullptr) const {
118+
OlapReaderStatistics* stats) const {
118119
DCHECK(_index_parsed);
119120
index_iterator->reset(new segment_v2::IndexedColumnIterator(_index_reader.get(), stats));
120121
return Status::OK();
@@ -155,7 +156,6 @@ class PrimaryKeyIndexReader {
155156
std::unique_ptr<segment_v2::BloomFilter> _bf;
156157
size_t _bf_num = 0;
157158
uint64 _bf_bytes = 0;
158-
OlapReaderStatistics* _pk_index_load_stats = nullptr;
159159
};
160160

161161
} // namespace doris

be/src/olap/rowset/beta_rowset_reader.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ bool BetaRowsetReader::update_profile(RuntimeProfile* profile) {
7878
Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context,
7979
std::vector<RowwiseIteratorUPtr>* out_iters,
8080
bool use_cache) {
81-
RETURN_IF_ERROR(_rowset->load());
8281
_read_context = read_context;
8382
// The segment iterator is created with its own statistics,
8483
// and the member variable '_stats' is initialized by '_stats(&owned_stats)'.
@@ -92,6 +91,9 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context
9291
if (_read_context->stats != nullptr) {
9392
_stats = _read_context->stats;
9493
}
94+
SCOPED_RAW_TIMER(&_stats->rowset_reader_get_segment_iterators_timer_ns);
95+
96+
RETURN_IF_ERROR(_rowset->load());
9597

9698
// convert RowsetReaderContext to StorageReadOptions
9799
_read_options.block_row_max = read_context->batch_size;
@@ -225,9 +227,12 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context
225227
bool should_use_cache = use_cache || (_read_context->reader_type == ReaderType::READER_QUERY &&
226228
enable_segment_cache);
227229
SegmentCacheHandle segment_cache_handle;
228-
RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(_rowset, &segment_cache_handle,
229-
should_use_cache,
230-
/*need_load_pk_index_and_bf*/ false));
230+
{
231+
SCOPED_RAW_TIMER(&_stats->rowset_reader_load_segments_timer_ns);
232+
RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(
233+
_rowset, &segment_cache_handle, should_use_cache,
234+
/*need_load_pk_index_and_bf*/ false));
235+
}
231236

232237
// create iterator for each segment
233238
auto& segments = segment_cache_handle.get_segments();
@@ -253,6 +258,7 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context
253258
const bool use_lazy_init_iterators =
254259
!is_merge_iterator && _read_context->reader_type == ReaderType::READER_QUERY;
255260
for (int i = seg_start; i < seg_end; i++) {
261+
SCOPED_RAW_TIMER(&_stats->rowset_reader_create_iterators_timer_ns);
256262
auto& seg_ptr = segments[i];
257263
std::unique_ptr<RowwiseIterator> iter;
258264

@@ -317,6 +323,8 @@ Status BetaRowsetReader::_init_iterator() {
317323
std::vector<RowwiseIteratorUPtr> iterators;
318324
RETURN_IF_ERROR(get_segment_iterators(_read_context, &iterators));
319325

326+
SCOPED_RAW_TIMER(&_stats->rowset_reader_init_iterators_timer_ns);
327+
320328
if (_read_context->merged_rows == nullptr) {
321329
_read_context->merged_rows = &_merged_rows;
322330
}
@@ -352,8 +360,8 @@ Status BetaRowsetReader::_init_iterator() {
352360
}
353361

354362
Status BetaRowsetReader::next_block(vectorized::Block* block) {
355-
SCOPED_RAW_TIMER(&_stats->block_fetch_ns);
356363
RETURN_IF_ERROR(_init_iterator_once());
364+
SCOPED_RAW_TIMER(&_stats->block_fetch_ns);
357365
if (_empty) {
358366
return Status::Error<END_OF_FILE>("BetaRowsetReader is empty");
359367
}
@@ -381,9 +389,8 @@ Status BetaRowsetReader::next_block(vectorized::Block* block) {
381389
}
382390

383391
Status BetaRowsetReader::next_block_view(vectorized::BlockView* block_view) {
384-
SCOPED_RAW_TIMER(&_stats->block_fetch_ns);
385392
RETURN_IF_ERROR(_init_iterator_once());
386-
393+
SCOPED_RAW_TIMER(&_stats->block_fetch_ns);
387394
RuntimeState* runtime_state = nullptr;
388395
if (_read_context != nullptr) {
389396
runtime_state = _read_context->runtime_state;

be/src/olap/rowset/segment_v2/bloom_filter_index_reader.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,8 @@ namespace segment_v2 {
3434
Status BloomFilterIndexReader::load(bool use_page_cache, bool kept_in_memory,
3535
OlapReaderStatistics* index_load_stats) {
3636
// TODO yyq: implement a new once flag to avoid status construct.
37-
_index_load_stats = index_load_stats;
38-
return _load_once.call([this, use_page_cache, kept_in_memory] {
39-
return _load(use_page_cache, kept_in_memory);
37+
return _load_once.call([this, use_page_cache, kept_in_memory, index_load_stats] {
38+
return _load(use_page_cache, kept_in_memory, index_load_stats);
4039
});
4140
}
4241

@@ -45,20 +44,22 @@ int64_t BloomFilterIndexReader::get_metadata_size() const {
4544
(_bloom_filter_index_meta ? _bloom_filter_index_meta->ByteSizeLong() : 0);
4645
}
4746

48-
Status BloomFilterIndexReader::_load(bool use_page_cache, bool kept_in_memory) {
47+
Status BloomFilterIndexReader::_load(bool use_page_cache, bool kept_in_memory,
48+
OlapReaderStatistics* index_load_stats) {
4949
const IndexedColumnMetaPB& bf_index_meta = _bloom_filter_index_meta->bloom_filter();
5050

5151
_bloom_filter_reader.reset(new IndexedColumnReader(_file_reader, bf_index_meta));
52-
RETURN_IF_ERROR(_bloom_filter_reader->load(use_page_cache, kept_in_memory, _index_load_stats));
52+
RETURN_IF_ERROR(_bloom_filter_reader->load(use_page_cache, kept_in_memory, index_load_stats));
5353
update_metadata_size();
5454
return Status::OK();
5555
}
5656

57-
Status BloomFilterIndexReader::new_iterator(std::unique_ptr<BloomFilterIndexIterator>* iterator) {
57+
Status BloomFilterIndexReader::new_iterator(std::unique_ptr<BloomFilterIndexIterator>* iterator,
58+
OlapReaderStatistics* index_load_stats) {
5859
DBUG_EXECUTE_IF("BloomFilterIndexReader::new_iterator.fail", {
5960
return Status::InternalError("new_iterator for bloom filter index failed");
6061
});
61-
iterator->reset(new BloomFilterIndexIterator(this));
62+
iterator->reset(new BloomFilterIndexIterator(this, index_load_stats));
6263
return Status::OK();
6364
}
6465

be/src/olap/rowset/segment_v2/bloom_filter_index_reader.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,17 +48,18 @@ class BloomFilterIndexReader : public MetadataAdder<BloomFilterIndexReader> {
4848
}
4949

5050
Status load(bool use_page_cache, bool kept_in_memory,
51-
OlapReaderStatistics* _bf_index_load_stats = nullptr);
51+
OlapReaderStatistics* bf_index_load_stats);
5252

5353
BloomFilterAlgorithmPB algorithm() { return _bloom_filter_index_meta->algorithm(); }
5454

5555
// create a new column iterator.
56-
Status new_iterator(std::unique_ptr<BloomFilterIndexIterator>* iterator);
56+
Status new_iterator(std::unique_ptr<BloomFilterIndexIterator>* iterator,
57+
OlapReaderStatistics* index_load_stats);
5758

5859
const TypeInfo* type_info() const { return _type_info; }
5960

6061
private:
61-
Status _load(bool use_page_cache, bool kept_in_memory);
62+
Status _load(bool use_page_cache, bool kept_in_memory, OlapReaderStatistics* index_load_stats);
6263

6364
int64_t get_metadata_size() const override;
6465

@@ -70,13 +71,12 @@ class BloomFilterIndexReader : public MetadataAdder<BloomFilterIndexReader> {
7071
const TypeInfo* _type_info = nullptr;
7172
std::unique_ptr<BloomFilterIndexPB> _bloom_filter_index_meta = nullptr;
7273
std::unique_ptr<IndexedColumnReader> _bloom_filter_reader;
73-
OlapReaderStatistics* _index_load_stats = nullptr;
7474
};
7575

7676
class BloomFilterIndexIterator {
7777
public:
78-
explicit BloomFilterIndexIterator(BloomFilterIndexReader* reader)
79-
: _reader(reader), _bloom_filter_iter(reader->_bloom_filter_reader.get()) {}
78+
explicit BloomFilterIndexIterator(BloomFilterIndexReader* reader, OlapReaderStatistics* stats)
79+
: _reader(reader), _bloom_filter_iter(reader->_bloom_filter_reader.get(), stats) {}
8080

8181
// Read bloom filter at the given ordinal into `bf`.
8282
Status read_bloom_filter(rowid_t ordinal, std::unique_ptr<BloomFilter>* bf);

0 commit comments

Comments
 (0)