@@ -83,16 +83,34 @@ idx_t RadixPartitioning::Select(Vector &hashes, const SelectionVector *sel, cons
83
83
84
84
struct ComputePartitionIndicesFunctor {
85
85
template <idx_t radix_bits>
86
- static void Operation (Vector &hashes, Vector &partition_indices, const SelectionVector &append_sel ,
87
- const idx_t append_count) {
86
+ static void Operation (Vector &hashes, Vector &partition_indices, const idx_t original_count ,
87
+ const SelectionVector &append_sel, const idx_t append_count) {
88
88
using CONSTANTS = RadixPartitioningConstants<radix_bits>;
89
- if (append_sel.IsSet ()) {
90
- auto hashes_sliced = Vector (hashes, append_sel, append_count);
91
- UnaryExecutor::Execute<hash_t , hash_t >(hashes_sliced, partition_indices, append_count,
92
- [&](hash_t hash) { return CONSTANTS::ApplyMask (hash); });
93
- } else {
89
+ if (!append_sel.IsSet () || hashes.GetVectorType () == VectorType::CONSTANT_VECTOR) {
94
90
UnaryExecutor::Execute<hash_t , hash_t >(hashes, partition_indices, append_count,
95
91
[&](hash_t hash) { return CONSTANTS::ApplyMask (hash); });
92
+ } else {
93
+ // We could just slice the "hashes" vector and use the UnaryExecutor
94
+ // But slicing a dictionary vector causes SelectionData to be allocated
95
+ // Instead, we just directly compute the partition indices using the selection vectors
96
+ UnifiedVectorFormat format;
97
+ hashes.ToUnifiedFormat (original_count, format);
98
+ const auto source_data = UnifiedVectorFormat::GetData<hash_t >(format);
99
+ const auto &source_sel = *format.sel ;
100
+
101
+ const auto target = FlatVector::GetData<hash_t >(partition_indices);
102
+
103
+ if (source_sel.IsSet ()) {
104
+ for (idx_t i = 0 ; i < append_count; i++) {
105
+ const auto source_idx = source_sel.get_index (append_sel[i]);
106
+ target[i] = CONSTANTS::ApplyMask (source_data[source_idx]);
107
+ }
108
+ } else {
109
+ for (idx_t i = 0 ; i < append_count; i++) {
110
+ const auto source_idx = append_sel[i];
111
+ target[i] = CONSTANTS::ApplyMask (source_data[source_idx]);
112
+ }
113
+ }
96
114
}
97
115
}
98
116
};
@@ -143,24 +161,20 @@ void RadixPartitionedColumnData::ComputePartitionIndices(PartitionedColumnDataAp
143
161
D_ASSERT (partitions.size () == RadixPartitioning::NumberOfPartitions (radix_bits));
144
162
D_ASSERT (state.partition_buffers .size () == RadixPartitioning::NumberOfPartitions (radix_bits));
145
163
RadixBitsSwitch<ComputePartitionIndicesFunctor, void >(radix_bits, input.data [hash_col_idx], state.partition_indices ,
146
- *FlatVector::IncrementalSelectionVector (), input.size ());
164
+ input.size (), *FlatVector::IncrementalSelectionVector (),
165
+ input.size ());
147
166
}
148
167
149
168
// ===--------------------------------------------------------------------===//
150
169
// Tuple Data Partitioning
151
170
// ===--------------------------------------------------------------------===//
152
- RadixPartitionedTupleData::RadixPartitionedTupleData (BufferManager &buffer_manager, const TupleDataLayout &layout_p,
153
- const idx_t radix_bits_p, const idx_t hash_col_idx_p)
154
- : PartitionedTupleData(PartitionedTupleDataType::RADIX, buffer_manager, layout_p.Copy()), radix_bits(radix_bits_p),
171
+ RadixPartitionedTupleData::RadixPartitionedTupleData (BufferManager &buffer_manager,
172
+ shared_ptr<TupleDataLayout> layout_ptr, const idx_t radix_bits_p,
173
+ const idx_t hash_col_idx_p)
174
+ : PartitionedTupleData(PartitionedTupleDataType::RADIX, buffer_manager, layout_ptr), radix_bits(radix_bits_p),
155
175
hash_col_idx (hash_col_idx_p) {
156
176
D_ASSERT (radix_bits <= RadixPartitioning::MAX_RADIX_BITS);
157
177
D_ASSERT (hash_col_idx < layout.GetTypes ().size ());
158
- const auto num_partitions = RadixPartitioning::NumberOfPartitions (radix_bits);
159
- allocators->allocators .reserve (num_partitions);
160
- for (idx_t i = 0 ; i < num_partitions; i++) {
161
- CreateAllocator ();
162
- }
163
- D_ASSERT (allocators->allocators .size () == num_partitions);
164
178
Initialize ();
165
179
}
166
180
@@ -186,8 +200,8 @@ void RadixPartitionedTupleData::InitializeAppendStateInternal(PartitionedTupleDa
186
200
const auto num_partitions = RadixPartitioning::NumberOfPartitions (radix_bits);
187
201
state.partition_pin_states .reserve (num_partitions);
188
202
for (idx_t i = 0 ; i < num_partitions; i++) {
189
- state.partition_pin_states .emplace_back (make_unsafe_uniq<TupleDataPinState>() );
190
- partitions[i]->InitializeAppend (* state.partition_pin_states [i], properties);
203
+ state.partition_pin_states .emplace_back ();
204
+ partitions[i]->InitializeAppend (state.partition_pin_states [i], properties);
191
205
}
192
206
193
207
// Init single chunk state
@@ -207,15 +221,18 @@ void RadixPartitionedTupleData::ComputePartitionIndices(PartitionedTupleDataAppe
207
221
const SelectionVector &append_sel, const idx_t append_count) {
208
222
D_ASSERT (partitions.size () == RadixPartitioning::NumberOfPartitions (radix_bits));
209
223
RadixBitsSwitch<ComputePartitionIndicesFunctor, void >(radix_bits, input.data [hash_col_idx], state.partition_indices ,
210
- append_sel, append_count);
224
+ input. size (), append_sel, append_count);
211
225
}
212
226
213
- void RadixPartitionedTupleData::ComputePartitionIndices (Vector &row_locations, idx_t count,
214
- Vector &partition_indices) const {
215
- Vector intermediate (LogicalType::HASH);
227
+ void RadixPartitionedTupleData::ComputePartitionIndices (Vector &row_locations, idx_t count, Vector &partition_indices,
228
+ unique_ptr<Vector> &utility_vector) const {
229
+ if (!utility_vector) {
230
+ utility_vector = make_uniq<Vector>(LogicalType::HASH);
231
+ }
232
+ Vector &intermediate = *utility_vector;
216
233
partitions[0 ]->Gather (row_locations, *FlatVector::IncrementalSelectionVector (), count, hash_col_idx, intermediate,
217
234
*FlatVector::IncrementalSelectionVector (), nullptr );
218
- RadixBitsSwitch<ComputePartitionIndicesFunctor, void >(radix_bits, intermediate, partition_indices,
235
+ RadixBitsSwitch<ComputePartitionIndicesFunctor, void >(radix_bits, intermediate, partition_indices, count,
219
236
*FlatVector::IncrementalSelectionVector (), count);
220
237
}
221
238
@@ -240,7 +257,7 @@ void RadixPartitionedTupleData::RepartitionFinalizeStates(PartitionedTupleData &
240
257
auto &partitions = new_partitioned_data.GetPartitions ();
241
258
for (idx_t partition_index = from_idx; partition_index < to_idx; partition_index++) {
242
259
auto &partition = *partitions[partition_index];
243
- auto &partition_pin_state = * state.partition_pin_states [partition_index];
260
+ auto &partition_pin_state = state.partition_pin_states [partition_index];
244
261
partition.FinalizePinState (partition_pin_state);
245
262
}
246
263
}
0 commit comments