This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 1d439d2ea9f [opt](parquet) add predicate filter time for parquet 
reader (#40005) (#40053)
1d439d2ea9f is described below

commit 1d439d2ea9f9beec2c06bb4c97da89b23501e792
Author: Mingyu Chen <[email protected]>
AuthorDate: Wed Aug 28 21:57:00 2024 +0800

    [opt](parquet) add predicate filter time for parquet reader (#40005) 
(#40053)
    
    bp #40005
---
 .../exec/format/parquet/vparquet_group_reader.cpp  | 40 ++++++++++++++++------
 .../exec/format/parquet/vparquet_group_reader.h    |  2 ++
 be/src/vec/exec/format/parquet/vparquet_reader.cpp |  4 +++
 be/src/vec/exec/format/parquet/vparquet_reader.h   |  2 ++
 4 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp 
b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp
index 9ec1235be1d..b70beec687b 100644
--- a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp
+++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp
@@ -345,8 +345,12 @@ Status RowGroupReader::next_batch(Block* block, size_t 
batch_size, size_t* read_
             }
             IColumn::Filter result_filter(block->rows(), 1);
             bool can_filter_all = false;
-            RETURN_IF_ERROR_OR_CATCH_EXCEPTION(VExprContext::execute_conjuncts(
-                    _filter_conjuncts, &filters, block, &result_filter, 
&can_filter_all));
+
+            {
+                SCOPED_RAW_TIMER(&_predicate_filter_time);
+                
RETURN_IF_ERROR_OR_CATCH_EXCEPTION(VExprContext::execute_conjuncts(
+                        _filter_conjuncts, &filters, block, &result_filter, 
&can_filter_all));
+            }
 
             if (can_filter_all) {
                 for (auto& col : columns_to_filter) {
@@ -361,6 +365,7 @@ Status RowGroupReader::next_batch(Block* block, size_t 
batch_size, size_t* read_
                     Block::filter_block_internal(block, columns_to_filter, 
result_filter));
             if (!_not_single_slot_filter_conjuncts.empty()) {
                 _convert_dict_cols_to_string_cols(block);
+                SCOPED_RAW_TIMER(&_predicate_filter_time);
                 RETURN_IF_CATCH_EXCEPTION(
                         
RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block(
                                 _not_single_slot_filter_conjuncts, nullptr, 
block,
@@ -450,7 +455,7 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t 
batch_size, size_t* re
         columns_to_filter[i] = i;
     }
     IColumn::Filter result_filter;
-    while (true) {
+    while (!_state->is_cancelled()) {
         // read predicate columns
         pre_read_rows = 0;
         pre_eof = false;
@@ -485,8 +490,12 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t 
batch_size, size_t* re
         for (auto& conjunct : _filter_conjuncts) {
             filter_contexts.emplace_back(conjunct);
         }
-        RETURN_IF_ERROR(VExprContext::execute_conjuncts(filter_contexts, 
&filters, block,
-                                                        &result_filter, 
&can_filter_all));
+
+        {
+            SCOPED_RAW_TIMER(&_predicate_filter_time);
+            RETURN_IF_ERROR(VExprContext::execute_conjuncts(filter_contexts, 
&filters, block,
+                                                            &result_filter, 
&can_filter_all));
+        }
 
         if (_lazy_read_ctx.resize_first_column) {
             // We have to clean the first column to insert right data.
@@ -523,6 +532,10 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t 
batch_size, size_t* re
             break;
         }
     }
+    if (_state->is_cancelled()) {
+        return Status::Cancelled("cancelled");
+    }
+
     if (select_vector_ptr == nullptr) {
         DCHECK_EQ(pre_read_rows + _cached_filtered_rows, 0);
         *read_rows = 0;
@@ -584,9 +597,13 @@ Status RowGroupReader::_do_lazy_read(Block* block, size_t 
batch_size, size_t* re
     RETURN_IF_ERROR(_fill_partition_columns(block, column_size, 
_lazy_read_ctx.partition_columns));
     RETURN_IF_ERROR(_fill_missing_columns(block, column_size, 
_lazy_read_ctx.missing_columns));
     if (!_not_single_slot_filter_conjuncts.empty()) {
-        
RETURN_IF_CATCH_EXCEPTION(RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block(
-                _not_single_slot_filter_conjuncts, nullptr, block, 
columns_to_filter,
-                origin_column_num)));
+        {
+            SCOPED_RAW_TIMER(&_predicate_filter_time);
+            RETURN_IF_CATCH_EXCEPTION(
+                    
RETURN_IF_ERROR(VExprContext::execute_conjuncts_and_filter_block(
+                            _not_single_slot_filter_conjuncts, nullptr, block, 
columns_to_filter,
+                            origin_column_num)));
+        }
     }
     return Status::OK();
 }
@@ -844,8 +861,11 @@ Status RowGroupReader::_rewrite_dict_predicates() {
             // The following process may be tricky and time-consuming, but we 
have no other way.
             
temp_block.get_by_position(0).column->assume_mutable()->resize(dict_value_column_size);
         }
-        
RETURN_IF_ERROR_OR_CATCH_EXCEPTION(VExprContext::execute_conjuncts_and_filter_block(
-                ctxs, nullptr, &temp_block, columns_to_filter, 
column_to_keep));
+        {
+            SCOPED_RAW_TIMER(&_predicate_filter_time);
+            
RETURN_IF_ERROR_OR_CATCH_EXCEPTION(VExprContext::execute_conjuncts_and_filter_block(
+                    ctxs, nullptr, &temp_block, columns_to_filter, 
column_to_keep));
+        }
         if (dict_pos != 0) {
             // We have to clean the first column to insert right data.
             temp_block.get_by_position(0).column->assume_mutable()->clear();
diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.h 
b/be/src/vec/exec/format/parquet/vparquet_group_reader.h
index d9f7f2dbf34..a889c1774ea 100644
--- a/be/src/vec/exec/format/parquet/vparquet_group_reader.h
+++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.h
@@ -157,6 +157,7 @@ public:
                 const std::unordered_map<int, VExprContextSPtrs>* 
slot_id_to_filter_conjuncts);
     Status next_batch(Block* block, size_t batch_size, size_t* read_rows, 
bool* batch_eof);
     int64_t lazy_read_filtered_rows() const { return _lazy_read_filtered_rows; 
}
+    int64_t predicate_filter_time() const { return _predicate_filter_time; }
 
     ParquetColumnReader::Statistics statistics();
     void set_remaining_rows(int64_t rows) { _remaining_rows = rows; }
@@ -211,6 +212,7 @@ private:
 
     const LazyReadContext& _lazy_read_ctx;
     int64_t _lazy_read_filtered_rows = 0;
+    int64_t _predicate_filter_time = 0;
     // If continuous batches are skipped, we can cache them to skip a whole 
page
     size_t _cached_filtered_rows = 0;
     std::unique_ptr<IColumn::Filter> _pos_delete_filter_ptr;
diff --git a/be/src/vec/exec/format/parquet/vparquet_reader.cpp 
b/be/src/vec/exec/format/parquet/vparquet_reader.cpp
index 84c572a3a2f..32391d1f0da 100644
--- a/be/src/vec/exec/format/parquet/vparquet_reader.cpp
+++ b/be/src/vec/exec/format/parquet/vparquet_reader.cpp
@@ -181,6 +181,8 @@ void ParquetReader::_init_profile() {
                 _profile, "SkipPageHeaderNum", TUnit::UNIT, parquet_profile, 
1);
         _parquet_profile.parse_page_header_num = ADD_CHILD_COUNTER_WITH_LEVEL(
                 _profile, "ParsePageHeaderNum", TUnit::UNIT, parquet_profile, 
1);
+        _parquet_profile.predicate_filter_time =
+                ADD_CHILD_TIMER_WITH_LEVEL(_profile, "PredicateFilterTime", 
parquet_profile, 1);
     }
 }
 
@@ -595,6 +597,7 @@ Status ParquetReader::get_next_block(Block* block, size_t* 
read_rows, bool* eof)
         auto column_st = _current_group_reader->statistics();
         _column_statistics.merge(column_st);
         _statistics.lazy_read_filtered_rows += 
_current_group_reader->lazy_read_filtered_rows();
+        _statistics.predicate_filter_time += 
_current_group_reader->predicate_filter_time();
         if (_read_row_groups.size() == 0) {
             *eof = true;
         } else {
@@ -1042,6 +1045,7 @@ void ParquetReader::_collect_profile() {
     COUNTER_UPDATE(_parquet_profile.skip_page_header_num, 
_column_statistics.skip_page_header_num);
     COUNTER_UPDATE(_parquet_profile.parse_page_header_num,
                    _column_statistics.parse_page_header_num);
+    COUNTER_UPDATE(_parquet_profile.predicate_filter_time, 
_statistics.predicate_filter_time);
     COUNTER_UPDATE(_parquet_profile.file_read_time, 
_column_statistics.read_time);
     COUNTER_UPDATE(_parquet_profile.file_read_calls, 
_column_statistics.read_calls);
     COUNTER_UPDATE(_parquet_profile.file_meta_read_calls, 
_column_statistics.meta_read_calls);
diff --git a/be/src/vec/exec/format/parquet/vparquet_reader.h 
b/be/src/vec/exec/format/parquet/vparquet_reader.h
index 9691e596b78..1d70f9ab5d5 100644
--- a/be/src/vec/exec/format/parquet/vparquet_reader.h
+++ b/be/src/vec/exec/format/parquet/vparquet_reader.h
@@ -91,6 +91,7 @@ public:
         int64_t page_index_filter_time = 0;
         int64_t read_page_index_time = 0;
         int64_t parse_page_index_time = 0;
+        int64_t predicate_filter_time = 0;
     };
 
     ParquetReader(RuntimeProfile* profile, const TFileScanRangeParams& params,
@@ -188,6 +189,7 @@ private:
         RuntimeProfile::Counter* decode_null_map_time = nullptr;
         RuntimeProfile::Counter* skip_page_header_num = nullptr;
         RuntimeProfile::Counter* parse_page_header_num = nullptr;
+        RuntimeProfile::Counter* predicate_filter_time = nullptr;
     };
 
     Status _open_file();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to