Coverage Report

Created: 2026-08-08 02:22

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