diff --git a/src/operators/physical_probe_filter.cpp b/src/operators/physical_probe_filter.cpp index dd239ac..ddb2176 100644 --- a/src/operators/physical_probe_filter.cpp +++ b/src/operators/physical_probe_filter.cpp @@ -104,6 +104,7 @@ OperatorResultType PhysicalProbeFilter::ExecuteInternal(ExecutionContext &contex (unsigned long long)build_col.table_index, (unsigned long long)build_col.column_index, build_table.c_str()); state.bloom_filters.push_back(bf); + state.sel_vector.emplace_back(STANDARD_VECTOR_SIZE); break; // found the filter for this column } } @@ -131,7 +132,6 @@ OperatorResultType PhysicalProbeFilter::ExecuteInternal(ExecutionContext &contex // apply bloom filters idx_t result_count = row_num; - auto &sel = state.sel; unique_ptr probe_timer; if (profiling_stats) { @@ -171,7 +171,8 @@ OperatorResultType PhysicalProbeFilter::ExecuteInternal(ExecutionContext &contex // } // lookup directly into selection vector - result_count = bf->LookupSel(input, sel, {bound_column_indices[i]}, state.bit_vector.data()); + + result_count = bf->LookupSel(input, state.sel_vector[i], {bound_column_indices[i]}, state.bit_vector.data()); // early exit if no rows passed if (result_count == 0) { @@ -185,7 +186,7 @@ OperatorResultType PhysicalProbeFilter::ExecuteInternal(ExecutionContext &contex // apply filter if we filtered rows if (result_count < row_num) { - input.Slice(sel, result_count); + input.Slice(state.sel_vector[i], result_count); row_num = result_count; } } @@ -193,12 +194,7 @@ OperatorResultType PhysicalProbeFilter::ExecuteInternal(ExecutionContext &contex // stop probe timer before output work probe_timer.reset(); - // optimization: if all rows passed, just reference input (zero-copy) - if (result_count == row_num) { - chunk.Reference(input); - } else { - chunk.Slice(input, sel, result_count); - } + chunk.Reference(input); if (profiling_stats) { profiling_stats->rows_in.fetch_add(original_row_num, std::memory_order_relaxed); diff --git a/src/operators/physical_probe_filter.hpp b/src/operators/physical_probe_filter.hpp index ec8d655..70e7d63 100644 --- a/src/operators/physical_probe_filter.hpp +++ b/src/operators/physical_probe_filter.hpp @@ -12,15 +12,14 @@ class PhysicalCreateFilter; class PhysicalProbeFilterState : public CachingOperatorState { public: - PhysicalProbeFilterState() - : bloom_filters_initialized(false), sel(STANDARD_VECTOR_SIZE), bit_vector((STANDARD_VECTOR_SIZE + 7) / 8) { + PhysicalProbeFilterState() : bloom_filters_initialized(false), bit_vector((STANDARD_VECTOR_SIZE + 7) / 8) { } vector> bloom_filters; bool bloom_filters_initialized; // reusable buffers to avoid per-chunk heap allocations - SelectionVector sel; + vector sel_vector; vector bit_vector; };