Coverage Report

Created: 2026-07-30 18:53

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
#include "runtime/file_scan_profile.h"
22
23
namespace doris::format::parquet {
24
25
530
void ParquetProfile::init(RuntimeProfile* profile) {
26
530
    if (profile == nullptr) {
27
206
        return;
28
206
    }
29
30
324
    file_scan_profile::ensure_hierarchy(profile);
31
324
    static const char* parquet_profile = "ParquetReader";
32
324
    total_time =
33
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, parquet_profile, file_scan_profile::FILE_READER, 1);
34
35
    // Row-group counters are part of the long-standing ParquetReader profile contract. Keep them
36
    // below the format node so profile parsers and operators can attribute pruning to Parquet.
37
324
    filtered_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsFiltered", TUnit::UNIT,
38
324
                                                       parquet_profile, 1);
39
324
    filtered_row_groups_by_min_max = ADD_CHILD_COUNTER_WITH_LEVEL(
40
324
            profile, "RowGroupsFilteredByMinMax", TUnit::UNIT, parquet_profile, 1);
41
324
    filtered_row_groups_by_dictionary = ADD_CHILD_COUNTER_WITH_LEVEL(
42
324
            profile, "RowGroupsFilteredByDictionary", TUnit::UNIT, parquet_profile, 1);
43
324
    filtered_row_groups_by_bloom_filter = ADD_CHILD_COUNTER_WITH_LEVEL(
44
324
            profile, "RowGroupsFilteredByBloomFilter", TUnit::UNIT, parquet_profile, 1);
45
324
    filtered_row_groups_by_page_index = ADD_CHILD_COUNTER_WITH_LEVEL(
46
324
            profile, "RowGroupsFilteredByPageIndex", TUnit::UNIT, parquet_profile, 1);
47
324
    to_read_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsReadNum", TUnit::UNIT,
48
324
                                                      parquet_profile, 1);
49
324
    total_row_groups = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowGroupsTotalNum", TUnit::UNIT,
50
324
                                                    parquet_profile, 1);
51
324
    selected_row_ranges = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SelectedRowRanges", TUnit::UNIT,
52
324
                                                       parquet_profile, 1);
53
324
    filtered_group_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByGroup", TUnit::UNIT,
54
324
                                                       parquet_profile, 1);
55
324
    filtered_page_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByPage", TUnit::UNIT,
56
324
                                                      parquet_profile, 1);
57
324
    pages_skipped_by_data_page_filter = ADD_CHILD_COUNTER_WITH_LEVEL(
58
324
            profile, "PagesSkippedByDataPageFilter", TUnit::UNIT, parquet_profile, 1);
59
324
    data_page_filter_skip_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DataPageFilterSkipBytes",
60
324
                                                               TUnit::BYTES, parquet_profile, 1);
61
324
    selected_rows =
62
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SelectedRows", TUnit::UNIT, parquet_profile, 1);
63
    // Keep every Parquet scan metric below the format node: profile consumers extract that
64
    // subtree and otherwise silently lose this counter even though filtering happened.
65
324
    rows_filtered_by_conjunct = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowsFilteredByConjunct",
66
324
                                                             TUnit::UNIT, parquet_profile, 1);
67
324
    total_batches =
68
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "TotalBatches", TUnit::UNIT, parquet_profile, 1);
69
324
    dense_batches =
70
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DenseBatches", TUnit::UNIT, parquet_profile, 1);
71
324
    selected_batches = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SelectedBatches", TUnit::UNIT,
72
324
                                                    parquet_profile, 1);
73
324
    empty_selection_batches = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "EmptySelectionBatches",
74
324
                                                           TUnit::UNIT, parquet_profile, 1);
75
324
    range_gap_skipped_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RangeGapSkippedRows",
76
324
                                                          TUnit::UNIT, parquet_profile, 1);
77
324
    reader_read_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderReadRows", TUnit::UNIT,
78
324
                                                    parquet_profile, 1);
79
324
    reader_skip_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderSkipRows", TUnit::UNIT,
80
324
                                                    parquet_profile, 1);
81
324
    reader_select_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ReaderSelectRows", TUnit::UNIT,
82
324
                                                      parquet_profile, 1);
83
324
    level_only_read_time =
84
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "LevelOnlyReadTime", parquet_profile, 1);
85
324
    level_only_skip_time =
86
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "LevelOnlySkipTime", parquet_profile, 1);
87
324
    materialization_time =
88
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "MaterializationTime", parquet_profile, 1);
89
324
    hybrid_selection_batches = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "HybridSelectionBatches",
90
324
                                                            TUnit::UNIT, parquet_profile, 1);
91
324
    hybrid_selection_ranges = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "HybridSelectionRanges",
92
324
                                                           TUnit::UNIT, parquet_profile, 1);
93
324
    hybrid_selection_null_fallback_batches = ADD_CHILD_COUNTER_WITH_LEVEL(
94
324
            profile, "HybridSelectionNullFallbackBatches", TUnit::UNIT, parquet_profile, 1);
95
324
    native_read_calls = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "NativeReadCalls", TUnit::UNIT,
96
324
                                                     parquet_profile, 1);
97
324
    native_page_fragments = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "NativePageFragments",
98
324
                                                         TUnit::UNIT, parquet_profile, 1);
99
324
    page_crossing_batches = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCrossingBatches",
100
324
                                                         TUnit::UNIT, parquet_profile, 1);
101
324
    nested_batches =
102
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "NestedBatches", TUnit::UNIT, parquet_profile, 1);
103
324
    lazy_read_filtered_rows = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredRowsByLazyRead",
104
324
                                                           TUnit::UNIT, parquet_profile, 1);
105
    // Format-specific counters stay below ParquetReader so subtree consumers cannot silently
106
    // attribute them to a different file format initialized on the same RuntimeProfile.
107
324
    filtered_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FilteredBytes", TUnit::BYTES,
108
324
                                                  parquet_profile, 1);
109
324
    raw_rows_read =
110
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RawRowsRead", TUnit::UNIT, parquet_profile, 1);
111
324
    column_read_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ColumnReadTime", parquet_profile, 1);
112
324
    parse_meta_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ParseMetaTime", parquet_profile, 1);
113
324
    parse_footer_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "ParseFooterTime", parquet_profile, 1);
114
324
    file_reader_create_time =
115
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "FileReaderCreateTime", parquet_profile, 1);
116
324
    open_file_num =
117
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FileNum", TUnit::UNIT, parquet_profile, 1);
118
324
    page_index_read_calls = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageIndexReadCalls", TUnit::UNIT,
119
324
                                                         parquet_profile, 1);
120
324
    page_index_filter_time =
121
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexFilterTime", parquet_profile, 1);
122
324
    read_page_index_time =
123
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexReadTime", parquet_profile, 1);
124
324
    parse_page_index_time =
125
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageIndexParseTime", parquet_profile, 1);
126
324
    expr_zonemap_unusable = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ExprZoneMapUnusableEvals",
127
324
                                                         TUnit::UNIT, parquet_profile, 1);
128
324
    in_zonemap_point_check = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "InZoneMapPointCheckCount",
129
324
                                                          TUnit::UNIT, parquet_profile, 1);
130
324
    in_zonemap_range_only = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "InZoneMapRangeOnlyCount",
131
324
                                                         TUnit::UNIT, parquet_profile, 1);
132
324
    row_group_filter_time =
133
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "RowGroupFilterTime", parquet_profile, 1);
134
324
    file_footer_read_calls = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FileFooterReadCalls",
135
324
                                                          TUnit::UNIT, parquet_profile, 1);
136
324
    file_footer_hit_cache = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "FileFooterHitCache", TUnit::UNIT,
137
324
                                                         parquet_profile, 1);
138
324
    decompress_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecompressTime", parquet_profile, 1);
139
324
    decompress_cnt = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DecompressCount", TUnit::UNIT,
140
324
                                                  parquet_profile, 1);
141
324
    page_read_counter =
142
324
            ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageReadCount", TUnit::UNIT, parquet_profile, 1);
143
324
    page_cache_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheWriteCount",
144
324
                                                            TUnit::UNIT, parquet_profile, 1);
145
324
    page_cache_compressed_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
146
324
            profile, "PageCacheCompressedWriteCount", TUnit::UNIT, parquet_profile, 1);
147
324
    page_cache_decompressed_write_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
148
324
            profile, "PageCacheDecompressedWriteCount", TUnit::UNIT, parquet_profile, 1);
149
324
    page_cache_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheHitCount", TUnit::UNIT,
150
324
                                                          parquet_profile, 1);
151
324
    page_cache_missing_counter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PageCacheMissingCount",
152
324
                                                              TUnit::UNIT, parquet_profile, 1);
153
324
    page_cache_compressed_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
154
324
            profile, "PageCacheCompressedHitCount", TUnit::UNIT, parquet_profile, 1);
155
324
    page_cache_decompressed_hit_counter = ADD_CHILD_COUNTER_WITH_LEVEL(
156
324
            profile, "PageCacheDecompressedHitCount", TUnit::UNIT, parquet_profile, 1);
157
324
    decode_header_time =
158
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageHeaderDecodeTime", parquet_profile, 1);
159
324
    read_page_header_time =
160
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PageHeaderReadTime", parquet_profile, 1);
161
324
    decode_value_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeValueTime", parquet_profile, 1);
162
324
    decode_dict_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeDictTime", parquet_profile, 1);
163
324
    decode_level_time = ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeLevelTime", parquet_profile, 1);
164
324
    decode_null_map_time =
165
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DecodeNullMapTime", parquet_profile, 1);
166
324
    skip_page_header_num = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "SkipPageHeaderNum", TUnit::UNIT,
167
324
                                                        parquet_profile, 1);
168
324
    parse_page_header_num = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "ParsePageHeaderNum", TUnit::UNIT,
169
324
                                                         parquet_profile, 1);
170
324
    predicate_filter_time =
171
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PredicateFilterTime", parquet_profile, 1);
172
324
    predicate_compaction_time =
173
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "PredicateCompactionTime", parquet_profile, 1);
174
324
    predicate_compaction_bytes = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PredicateCompactionBytes",
175
324
                                                              TUnit::BYTES, parquet_profile, 1);
176
324
    predicate_compaction_count = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PredicateCompactionCount",
177
324
                                                              TUnit::UNIT, parquet_profile, 1);
178
324
    predicate_alignment_columns = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "PredicateAlignmentColumns",
179
324
                                                               TUnit::UNIT, parquet_profile, 1);
180
324
    fixed_width_predicate_direct_batches = ADD_CHILD_COUNTER_WITH_LEVEL(
181
324
            profile, "FixedWidthPredicateDirectBatches", TUnit::UNIT, parquet_profile, 1);
182
324
    fixed_width_predicate_direct_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
183
324
            profile, "FixedWidthPredicateDirectRows", TUnit::UNIT, parquet_profile, 1);
184
324
    raw_value_predicate_direct_batches = ADD_CHILD_COUNTER_WITH_LEVEL(
185
324
            profile, "RawValuePredicateDirectBatches", TUnit::UNIT, parquet_profile, 1);
186
324
    raw_value_predicate_direct_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
187
324
            profile, "RawValuePredicateDirectRows", TUnit::UNIT, parquet_profile, 1);
188
324
    typed_runtime_filter_direct_batches = ADD_CHILD_COUNTER_WITH_LEVEL(
189
324
            profile, "TypedRuntimeFilterDirectBatches", TUnit::UNIT, parquet_profile, 1);
190
324
    typed_runtime_filter_direct_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
191
324
            profile, "TypedRuntimeFilterDirectRows", TUnit::UNIT, parquet_profile, 1);
192
324
    dictionary_predicate_direct_batches = ADD_CHILD_COUNTER_WITH_LEVEL(
193
324
            profile, "DictionaryPredicateDirectBatches", TUnit::UNIT, parquet_profile, 1);
194
324
    dictionary_predicate_direct_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
195
324
            profile, "DictionaryPredicateDirectRows", TUnit::UNIT, parquet_profile, 1);
196
324
    dictionary_predicate_projected_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
197
324
            profile, "DictionaryPredicateProjectedRows", TUnit::UNIT, parquet_profile, 1);
198
324
    dictionary_predicate_fused_projected_rows = ADD_CHILD_COUNTER_WITH_LEVEL(
199
324
            profile, "DictionaryPredicateFusedProjectedRows", TUnit::UNIT, parquet_profile, 1);
200
324
    dict_filter_rewrite_time =
201
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterRewriteTime", parquet_profile, 1);
202
324
    dict_filter_expr_rewrite_time =
203
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterExprRewriteTime", parquet_profile, 1);
204
324
    dict_filter_read_dict_time =
205
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterReadDictTime", parquet_profile, 1);
206
324
    dict_filter_build_time =
207
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "DictFilterBuildTime", parquet_profile, 1);
208
324
    dict_filter_candidate_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
209
324
            profile, "DictFilterCandidateColumns", TUnit::UNIT, parquet_profile, 1);
210
324
    dict_filter_columns = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DictFilterColumns", TUnit::UNIT,
211
324
                                                       parquet_profile, 1);
212
324
    dict_filter_typed_compare_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
213
324
            profile, "DictFilterTypedCompareColumns", TUnit::UNIT, parquet_profile, 1);
214
324
    dict_filter_string_compare_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
215
324
            profile, "DictFilterStringCompareColumns", TUnit::UNIT, parquet_profile, 1);
216
324
    dict_filter_vectorized_runtime_filter_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
217
324
            profile, "DictFilterVectorizedRuntimeFilterColumns", TUnit::UNIT, parquet_profile, 1);
218
324
    dict_filter_unsupported_columns = ADD_CHILD_COUNTER_WITH_LEVEL(
219
324
            profile, "DictFilterUnsupportedColumns", TUnit::UNIT, parquet_profile, 1);
220
324
    dict_filter_read_failures = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "DictFilterReadFailures",
221
324
                                                             TUnit::UNIT, parquet_profile, 1);
222
324
    rows_filtered_by_dict_filter = ADD_CHILD_COUNTER_WITH_LEVEL(profile, "RowsFilteredByDictFilter",
223
324
                                                                TUnit::UNIT, parquet_profile, 1);
224
324
    bloom_filter_read_time =
225
324
            ADD_CHILD_TIMER_WITH_LEVEL(profile, "BloomFilterReadTime", parquet_profile, 1);
226
324
}
227
228
156
void ParquetProfile::update_pruning_stats(const ParquetPruningStats& pruning_stats) const {
229
156
    COUNTER_UPDATE(filtered_row_groups,
230
156
                   pruning_stats.total_row_groups - pruning_stats.selected_row_groups);
231
156
    COUNTER_UPDATE(filtered_row_groups_by_min_max, pruning_stats.filtered_row_groups_by_statistics);
232
156
    COUNTER_UPDATE(filtered_row_groups_by_dictionary,
233
156
                   pruning_stats.filtered_row_groups_by_dictionary);
234
156
    COUNTER_UPDATE(filtered_row_groups_by_bloom_filter,
235
156
                   pruning_stats.filtered_row_groups_by_bloom_filter);
236
156
    COUNTER_UPDATE(filtered_row_groups_by_page_index,
237
156
                   pruning_stats.filtered_row_groups_by_page_index);
238
156
    COUNTER_UPDATE(to_read_row_groups, pruning_stats.selected_row_groups);
239
156
    COUNTER_UPDATE(total_row_groups, pruning_stats.total_row_groups);
240
156
    COUNTER_UPDATE(selected_row_ranges, pruning_stats.selected_row_ranges);
241
156
    COUNTER_UPDATE(filtered_group_rows, pruning_stats.filtered_group_rows);
242
156
    COUNTER_UPDATE(filtered_bytes, pruning_stats.filtered_bytes);
243
156
    COUNTER_UPDATE(filtered_page_rows, pruning_stats.filtered_page_rows);
244
156
    COUNTER_UPDATE(page_index_read_calls, pruning_stats.page_index_read_calls);
245
156
    COUNTER_UPDATE(bloom_filter_read_time, pruning_stats.bloom_filter_read_time);
246
156
    COUNTER_UPDATE(row_group_filter_time, pruning_stats.row_group_filter_time);
247
156
    COUNTER_UPDATE(page_index_filter_time, pruning_stats.page_index_filter_time);
248
156
    COUNTER_UPDATE(read_page_index_time, pruning_stats.read_page_index_time);
249
156
    COUNTER_UPDATE(parse_page_index_time, pruning_stats.parse_page_index_time);
250
156
    COUNTER_UPDATE(expr_zonemap_unusable, pruning_stats.expr_zonemap_unusable_evals);
251
156
    COUNTER_UPDATE(in_zonemap_point_check, pruning_stats.in_zonemap_point_check_count);
252
156
    COUNTER_UPDATE(in_zonemap_range_only, pruning_stats.in_zonemap_range_only_count);
253
156
}
254
255
void ParquetProfile::update_deferred_pruning_stats(const ParquetPruningStats& pruning_stats,
256
172
                                                   bool selected) const {
257
172
    const int64_t filtered = selected ? 0 : 1;
258
172
    COUNTER_UPDATE(filtered_row_groups, filtered);
259
172
    COUNTER_UPDATE(filtered_row_groups_by_dictionary,
260
172
                   pruning_stats.filtered_row_groups_by_dictionary);
261
172
    COUNTER_UPDATE(filtered_row_groups_by_bloom_filter,
262
172
                   pruning_stats.filtered_row_groups_by_bloom_filter);
263
172
    COUNTER_UPDATE(filtered_row_groups_by_page_index,
264
172
                   pruning_stats.filtered_row_groups_by_page_index);
265
    // Initial footer planning counts every surviving candidate as readable. Lazy probes correct
266
    // that estimate only when a later dictionary, Bloom, or page-index check removes the group.
267
172
    COUNTER_UPDATE(to_read_row_groups, -filtered);
268
172
    COUNTER_UPDATE(selected_row_ranges, pruning_stats.selected_row_ranges);
269
172
    COUNTER_UPDATE(filtered_group_rows, pruning_stats.filtered_group_rows);
270
172
    COUNTER_UPDATE(filtered_bytes, pruning_stats.filtered_bytes);
271
172
    COUNTER_UPDATE(filtered_page_rows, pruning_stats.filtered_page_rows);
272
172
    COUNTER_UPDATE(page_index_read_calls, pruning_stats.page_index_read_calls);
273
172
    COUNTER_UPDATE(bloom_filter_read_time, pruning_stats.bloom_filter_read_time);
274
172
    COUNTER_UPDATE(row_group_filter_time, pruning_stats.row_group_filter_time);
275
172
    COUNTER_UPDATE(page_index_filter_time, pruning_stats.page_index_filter_time);
276
172
    COUNTER_UPDATE(read_page_index_time, pruning_stats.read_page_index_time);
277
172
    COUNTER_UPDATE(parse_page_index_time, pruning_stats.parse_page_index_time);
278
172
    COUNTER_UPDATE(expr_zonemap_unusable, pruning_stats.expr_zonemap_unusable_evals);
279
172
    COUNTER_UPDATE(in_zonemap_point_check, pruning_stats.in_zonemap_point_check_count);
280
172
    COUNTER_UPDATE(in_zonemap_range_only, pruning_stats.in_zonemap_range_only_count);
281
172
}
282
283
253
ParquetPageSkipProfile ParquetProfile::page_skip_profile() const {
284
253
    return {
285
253
            .skipped_pages = pages_skipped_by_data_page_filter,
286
253
            .skipped_bytes = data_page_filter_skip_bytes,
287
253
    };
288
253
}
289
290
541
ParquetColumnReaderProfile ParquetProfile::column_reader_profile() const {
291
541
    return {
292
541
            .reader_read_rows = reader_read_rows,
293
541
            .reader_skip_rows = reader_skip_rows,
294
541
            .reader_select_rows = reader_select_rows,
295
541
            .level_only_read_time = level_only_read_time,
296
541
            .level_only_skip_time = level_only_skip_time,
297
541
            .materialization_time = materialization_time,
298
541
            .hybrid_selection_batches = hybrid_selection_batches,
299
541
            .hybrid_selection_ranges = hybrid_selection_ranges,
300
541
            .hybrid_selection_null_fallback_batches = hybrid_selection_null_fallback_batches,
301
541
            .dictionary_predicate_fused_projected_rows = dictionary_predicate_fused_projected_rows,
302
541
            .decompress_time = decompress_time,
303
541
            .decompress_count = decompress_cnt,
304
541
            .decode_header_time = decode_header_time,
305
541
            .decode_value_time = decode_value_time,
306
541
            .decode_dictionary_time = decode_dict_time,
307
541
            .decode_level_time = decode_level_time,
308
541
            .decode_null_map_time = decode_null_map_time,
309
541
            .page_index_read_calls = page_index_read_calls,
310
541
            .skip_page_header_count = skip_page_header_num,
311
541
            .parse_page_header_count = parse_page_header_num,
312
541
            .read_page_header_time = read_page_header_time,
313
541
            .page_read_count = page_read_counter,
314
541
            .page_cache_write_count = page_cache_write_counter,
315
541
            .page_cache_compressed_write_count = page_cache_compressed_write_counter,
316
541
            .page_cache_decompressed_write_count = page_cache_decompressed_write_counter,
317
541
            .page_cache_hit_count = page_cache_hit_counter,
318
541
            .page_cache_miss_count = page_cache_missing_counter,
319
541
            .page_cache_compressed_hit_count = page_cache_compressed_hit_counter,
320
541
            .page_cache_decompressed_hit_count = page_cache_decompressed_hit_counter,
321
541
            .native_read_calls = native_read_calls,
322
541
            .native_page_fragments = native_page_fragments,
323
541
            .page_crossing_batches = page_crossing_batches,
324
541
            .nested_batches = nested_batches,
325
541
    };
326
541
}
327
328
260
ParquetScanProfile ParquetProfile::scan_profile() const {
329
260
    return {
330
260
            .raw_rows_read = raw_rows_read,
331
260
            .selected_rows = selected_rows,
332
260
            .rows_filtered_by_conjunct = rows_filtered_by_conjunct,
333
260
            .lazy_read_filtered_rows = lazy_read_filtered_rows,
334
260
            .total_batches = total_batches,
335
260
            .dense_batches = dense_batches,
336
260
            .selected_batches = selected_batches,
337
260
            .empty_selection_batches = empty_selection_batches,
338
260
            .range_gap_skipped_rows = range_gap_skipped_rows,
339
260
            .column_read_time = column_read_time,
340
260
            .predicate_filter_time = predicate_filter_time,
341
260
            .predicate_compaction_time = predicate_compaction_time,
342
260
            .predicate_compaction_bytes = predicate_compaction_bytes,
343
260
            .predicate_compaction_count = predicate_compaction_count,
344
260
            .predicate_alignment_columns = predicate_alignment_columns,
345
260
            .fixed_width_predicate_direct_batches = fixed_width_predicate_direct_batches,
346
260
            .fixed_width_predicate_direct_rows = fixed_width_predicate_direct_rows,
347
260
            .raw_value_predicate_direct_batches = raw_value_predicate_direct_batches,
348
260
            .raw_value_predicate_direct_rows = raw_value_predicate_direct_rows,
349
260
            .typed_runtime_filter_direct_batches = typed_runtime_filter_direct_batches,
350
260
            .typed_runtime_filter_direct_rows = typed_runtime_filter_direct_rows,
351
260
            .dictionary_predicate_direct_batches = dictionary_predicate_direct_batches,
352
260
            .dictionary_predicate_direct_rows = dictionary_predicate_direct_rows,
353
260
            .dictionary_predicate_projected_rows = dictionary_predicate_projected_rows,
354
260
            .dict_filter_rewrite_time = dict_filter_rewrite_time,
355
260
            .dict_filter_expr_rewrite_time = dict_filter_expr_rewrite_time,
356
260
            .dict_filter_read_dict_time = dict_filter_read_dict_time,
357
260
            .dict_filter_build_time = dict_filter_build_time,
358
260
            .dict_filter_candidate_columns = dict_filter_candidate_columns,
359
260
            .dict_filter_columns = dict_filter_columns,
360
260
            .dict_filter_typed_compare_columns = dict_filter_typed_compare_columns,
361
260
            .dict_filter_string_compare_columns = dict_filter_string_compare_columns,
362
260
            .dict_filter_vectorized_runtime_filter_columns =
363
260
                    dict_filter_vectorized_runtime_filter_columns,
364
260
            .dict_filter_unsupported_columns = dict_filter_unsupported_columns,
365
260
            .dict_filter_read_failures = dict_filter_read_failures,
366
260
            .rows_filtered_by_dict_filter = rows_filtered_by_dict_filter,
367
260
            .column_reader_profile = column_reader_profile(),
368
260
    };
369
260
}
370
371
} // namespace doris::format::parquet