Coverage Report

Created: 2026-08-02 02:36

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