Coverage Report

Created: 2026-07-22 14:34

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/format_v2/parquet/parquet_profile.cpp
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#include "format_v2/parquet/parquet_profile.h"
19
20
#include "format_v2/parquet/parquet_statistics.h"
21
22
namespace doris::format::parquet {
23
24
190
void ParquetProfile::init(RuntimeProfile* profile) {
25
190
    if (profile == nullptr) {
26
96
        return;
27
96
    }
28
29
94
    static const char* parquet_profile = "ParquetReader";
30
94
    ADD_TIMER_WITH_LEVEL(profile, parquet_profile, 1);
31
32
94
    filtered_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsFiltered", TUnit::UNIT,
33
94
                                                       parquet_profile, 1);
34
94
    filtered_row_groups_by_min_max = ADD_CHILD_COUNTER_WITH_LEVEL(
35
94
            profile, "RowGroupsFilteredByMinMax", TUnit::UNIT, parquet_profile, 1);
36
94
    filtered_row_groups_by_dictionary = ADD_CHILD_COUNTER_WITH_LEVEL(
37
94
            profile, "RowGroupsFilteredByDictionary", TUnit::UNIT, parquet_profile, 1);
38
94
    filtered_row_groups_by_bloom_filter = ADD_CHILD_COUNTER_WITH_LEVEL(
39
94
            profile, "RowGroupsFilteredByBloomFilter", TUnit::UNIT, parquet_profile, 1);
40
94
    filtered_row_groups_by_page_index = ADD_CHILD_COUNTER_WITH_LEVEL(
41
94
            profile, "RowGroupsFilteredByPageIndex", TUnit::UNIT, parquet_profile, 1);
42
94
    to_read_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsReadNum", TUnit::UNIT,
43
94
                                                      parquet_profile, 1);
44
94
    total_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsTotalNum", TUnit::UNIT,
45
94
                                                    parquet_profile, 1);
46
94
    selected_row_ranges = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SelectedRowRanges", TUnit::UNIT,
47
94
                                                       parquet_profile, 1);
48
94
    filtered_group_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByGroup", TUnit::UNIT,
49
94
                                                       parquet_profile, 1);
50
94
    filtered_page_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByPage", TUnit::UNIT,
51
94
                                                      parquet_profile, 1);
52
94
    pages_skipped_by_data_page_filter = ADD_CHILD_COUNTER_WITH_LEVEL(
53
94
            profile, "PagesSkippedByDataPageFilter", TUnit::UNIT, parquet_profile, 1);
54
94
    data_page_filter_skip_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DataPageFilterSkipBytes",
55
94
                                                               TUnit::BYTES, parquet_profile, 1);
56
94
    selected_rows =
57
94
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SelectedRows", TUnit::UNIT, parquet_profile, 1);
58
94
    rows_filtered_by_conjunct = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowsFilteredByConjunct",
59
94
                                                             TUnit::UNIT, parquet_profile, 1);
60
94
    total_batches =
61
94
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "TotalBatches", TUnit::UNIT, parquet_profile, 1);
62
94
    empty_selection_batches = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "EmptySelectionBatches",
63
94
                                                           TUnit::UNIT, parquet_profile, 1);
64
94
    range_gap_skipped_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RangeGapSkippedRows",
65
94
                                                          TUnit::UNIT, parquet_profile, 1);
66
94
    reader_read_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderReadRows", TUnit::UNIT,
67
94
                                                    parquet_profile, 1);
68
94
    reader_skip_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderSkipRows", TUnit::UNIT,
69
94
                                                    parquet_profile, 1);
70
94
    reader_select_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderSelectRows", TUnit::UNIT,
71
94
                                                      parquet_profile, 1);
72
94
    arrow_read_records_time =
73
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "ArrowReadRecordsTime", parquet_profile, 1);
74
94
    arrow_skip_records_time =
75
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "ArrowSkipRecordsTime", parquet_profile, 1);
76
94
    materialization_time =
77
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "MaterializationTime", parquet_profile, 1);
78
94
    lazy_read_filtered_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByLazyRead",
79
94
                                                           TUnit::UNIT, parquet_profile, 1);
80
94
    filtered_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredBytes", TUnit::BYTES,
81
94
                                                  parquet_profile, 1);
82
94
    raw_rows_read =
83
94
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RawRowsRead", TUnit::UNIT, parquet_profile, 1);
84
94
    column_read_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ColumnReadTime", parquet_profile, 1);
85
94
    parse_meta_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ParseMetaTime", parquet_profile, 1);
86
94
    parse_footer_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ParseFooterTime", parquet_profile, 1);
87
94
    file_reader_create_time =
88
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "FileReaderCreateTime", parquet_profile, 1);
89
94
    open_file_num =
90
94
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FileNum", TUnit::UNIT, parquet_profile, 1);
91
94
    page_index_read_calls = ADD_COUNTER_WITH_LEVEL(profile, "PageIndexReadCalls", TUnit::UNIT, 1);
92
94
    page_index_filter_time =
93
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexFilterTime", parquet_profile, 1);
94
94
    read_page_index_time =
95
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexReadTime", parquet_profile, 1);
96
94
    parse_page_index_time =
97
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexParseTime", parquet_profile, 1);
98
94
    expr_zonemap_unusable = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ExprZoneMapUnusableEvals",
99
94
                                                         TUnit::UNIT, parquet_profile, 1);
100
94
    in_zonemap_point_check = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "InZoneMapPointCheckCount",
101
94
                                                          TUnit::UNIT, parquet_profile, 1);
102
94
    in_zonemap_range_only = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "InZoneMapRangeOnlyCount",
103
94
                                                         TUnit::UNIT, parquet_profile, 1);
104
94
    row_group_filter_time =
105
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "RowGroupFilterTime", parquet_profile, 1);
106
94
    file_footer_read_calls = ADD_COUNTER_WITH_LEVEL(profile, "FileFooterReadCalls", TUnit::UNIT, 1);
107
94
    file_footer_hit_cache = ADD_COUNTER_WITH_LEVEL(profile, "FileFooterHitCache", TUnit::UNIT, 1);
108
94
    decompress_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecompressTime", parquet_profile, 1);
109
94
    decompress_cnt = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DecompressCount", TUnit::UNIT,
110
94
                                                  parquet_profile, 1);
111
94
    page_read_counter =
112
94
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageReadCount", TUnit::UNIT, parquet_profile, 1);
113
94
    page_cache_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheWriteCount",
114
94
                                                            TUnit::UNIT, parquet_profile, 1);
115
94
    page_cache_compressed_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
116
94
            profile, "PageCacheCompressedWriteCount", TUnit::UNIT, parquet_profile, 1);
117
94
    page_cache_decompressed_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
118
94
            profile, "PageCacheDecompressedWriteCount", TUnit::UNIT, parquet_profile, 1);
119
94
    page_cache_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheHitCount", TUnit::UNIT,
120
94
                                                          parquet_profile, 1);
121
94
    page_cache_missing_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheMissingCount",
122
94
                                                              TUnit::UNIT, parquet_profile, 1);
123
94
    page_cache_compressed_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
124
94
            profile, "PageCacheCompressedHitCount", TUnit::UNIT, parquet_profile, 1);
125
94
    page_cache_decompressed_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
126
94
            profile, "PageCacheDecompressedHitCount", TUnit::UNIT, parquet_profile, 1);
127
94
    decode_header_time =
128
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageHeaderDecodeTime", parquet_profile, 1);
129
94
    read_page_header_time =
130
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageHeaderReadTime", parquet_profile, 1);
131
94
    decode_value_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeValueTime", parquet_profile, 1);
132
94
    decode_dict_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeDictTime", parquet_profile, 1);
133
94
    decode_level_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeLevelTime", parquet_profile, 1);
134
94
    decode_null_map_time =
135
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeNullMapTime", parquet_profile, 1);
136
94
    skip_page_header_num = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SkipPageHeaderNum", TUnit::UNIT,
137
94
                                                        parquet_profile, 1);
138
94
    parse_page_header_num = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ParsePageHeaderNum", TUnit::UNIT,
139
94
                                                         parquet_profile, 1);
140
94
    predicate_filter_time =
141
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PredicateFilterTime", parquet_profile, 1);
142
94
    dict_filter_rewrite_time =
143
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterRewriteTime", parquet_profile, 1);
144
94
    dict_filter_expr_rewrite_time =
145
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterExprRewriteTime", parquet_profile, 1);
146
94
    dict_filter_read_dict_time =
147
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterReadDictTime", parquet_profile, 1);
148
94
    dict_filter_build_time =
149
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterBuildTime", parquet_profile, 1);
150
94
    dict_filter_candidate_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
151
94
            profile, "DictFilterCandidateColumns", TUnit::UNIT, parquet_profile, 1);
152
94
    dict_filter_columns = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DictFilterColumns", TUnit::UNIT,
153
94
                                                       parquet_profile, 1);
154
94
    dict_filter_unsupported_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
155
94
            profile, "DictFilterUnsupportedColumns", TUnit::UNIT, parquet_profile, 1);
156
94
    dict_filter_read_failures = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DictFilterReadFailures",
157
94
                                                             TUnit::UNIT, parquet_profile, 1);
158
94
    rows_filtered_by_dict_filter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowsFilteredByDictFilter",
159
94
                                                                TUnit::UNIT, parquet_profile, 1);
160
94
    convert_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ConvertTime", parquet_profile, 1);
161
94
    bloom_filter_read_time =
162
94
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "BloomFilterReadTime", parquet_profile, 1);
163
94
}
164
165
94
void ParquetProfile::update_pruning_stats(const ParquetPruningStats& pruning_stats) const {
166
94
    COUNTER_UPDATE(filtered_row_groups,
167
94
                   pruning_stats.total_row_groups - pruning_stats.selected_row_groups);
168
94
    COUNTER_UPDATE(filtered_row_groups_by_min_max, pruning_stats.filtered_row_groups_by_statistics);
169
94
    COUNTER_UPDATE(filtered_row_groups_by_dictionary,
170
94
                   pruning_stats.filtered_row_groups_by_dictionary);
171
94
    COUNTER_UPDATE(filtered_row_groups_by_bloom_filter,
172
94
                   pruning_stats.filtered_row_groups_by_bloom_filter);
173
94
    COUNTER_UPDATE(filtered_row_groups_by_page_index,
174
94
                   pruning_stats.filtered_row_groups_by_page_index);
175
94
    COUNTER_UPDATE(to_read_row_groups, pruning_stats.selected_row_groups);
176
94
    COUNTER_UPDATE(total_row_groups, pruning_stats.total_row_groups);
177
94
    COUNTER_UPDATE(selected_row_ranges, pruning_stats.selected_row_ranges);
178
94
    COUNTER_UPDATE(filtered_group_rows, pruning_stats.filtered_group_rows);
179
94
    COUNTER_UPDATE(filtered_page_rows, pruning_stats.filtered_page_rows);
180
94
    COUNTER_UPDATE(page_index_read_calls, pruning_stats.page_index_read_calls);
181
94
    COUNTER_UPDATE(bloom_filter_read_time, pruning_stats.bloom_filter_read_time);
182
94
    COUNTER_UPDATE(row_group_filter_time, pruning_stats.row_group_filter_time);
183
94
    COUNTER_UPDATE(page_index_filter_time, pruning_stats.page_index_filter_time);
184
94
    COUNTER_UPDATE(read_page_index_time, pruning_stats.read_page_index_time);
185
94
    COUNTER_UPDATE(expr_zonemap_unusable, pruning_stats.expr_zonemap_unusable_evals);
186
94
    COUNTER_UPDATE(in_zonemap_point_check, pruning_stats.in_zonemap_point_check_count);
187
94
    COUNTER_UPDATE(in_zonemap_range_only, pruning_stats.in_zonemap_range_only_count);
188
94
}
189
190
192
ParquetPageSkipProfile ParquetProfile::page_skip_profile() const {
191
192
    return {
192
192
            .skipped_pages = pages_skipped_by_data_page_filter,
193
192
            .skipped_bytes = data_page_filter_skip_bytes,
194
192
    };
195
192
}
196
197
192
ParquetColumnReaderProfile ParquetProfile::column_reader_profile() const {
198
192
    return {
199
192
            .reader_read_rows = reader_read_rows,
200
192
            .reader_skip_rows = reader_skip_rows,
201
192
            .reader_select_rows = reader_select_rows,
202
192
            .arrow_read_records_time = arrow_read_records_time,
203
192
            .arrow_skip_records_time = arrow_skip_records_time,
204
192
            .materialization_time = materialization_time,
205
192
    };
206
192
}
207
208
192
ParquetScanProfile ParquetProfile::scan_profile() const {
209
192
    return {
210
192
            .raw_rows_read = raw_rows_read,
211
192
            .selected_rows = selected_rows,
212
192
            .rows_filtered_by_conjunct = rows_filtered_by_conjunct,
213
192
            .lazy_read_filtered_rows = lazy_read_filtered_rows,
214
192
            .total_batches = total_batches,
215
192
            .empty_selection_batches = empty_selection_batches,
216
192
            .range_gap_skipped_rows = range_gap_skipped_rows,
217
192
            .column_read_time = column_read_time,
218
192
            .predicate_filter_time = predicate_filter_time,
219
192
            .dict_filter_rewrite_time = dict_filter_rewrite_time,
220
192
            .dict_filter_expr_rewrite_time = dict_filter_expr_rewrite_time,
221
192
            .dict_filter_read_dict_time = dict_filter_read_dict_time,
222
192
            .dict_filter_build_time = dict_filter_build_time,
223
192
            .dict_filter_candidate_columns = dict_filter_candidate_columns,
224
192
            .dict_filter_columns = dict_filter_columns,
225
192
            .dict_filter_unsupported_columns = dict_filter_unsupported_columns,
226
192
            .dict_filter_read_failures = dict_filter_read_failures,
227
192
            .rows_filtered_by_dict_filter = rows_filtered_by_dict_filter,
228
192
            .column_reader_profile = column_reader_profile(),
229
192
    };
230
192
}
231
232
} // namespace doris::format::parquet