28 const std::vector<InputTableInfo>& query_infos,
32 const std::vector<InnerOuter>& inner_outer_pairs,
33 const int device_count,
55 static std::shared_ptr<OverlapsJoinHashTable>
getInstance(
56 const std::shared_ptr<Analyzer::BinOper> condition,
57 const std::vector<InputTableInfo>& query_infos,
60 const int device_count,
78 auto candidate_table_keys =
80 if (candidate_table_keys.has_value()) {
82 *candidate_table_keys,
86 *candidate_table_keys,
107 virtual void reifyImpl(std::vector<ColumnsForDevice>& columns_per_device,
110 const size_t shard_count,
111 const size_t entry_count,
112 const size_t emitted_keys_count,
113 const bool skip_hashtable_caching,
114 const size_t chosen_max_hashtable_size,
115 const double chosen_bucket_threshold);
119 const size_t entry_count,
120 const size_t emitted_keys_count,
121 const bool skip_hashtable_caching,
126 size_t emitted_keys_count,
127 size_t entry_count)
const;
130 const std::vector<Fragmenter_Namespace::FragmentInfo>& fragments,
136 const std::vector<double>& inverse_bucket_sizes_for_dimension,
137 std::vector<ColumnsForDevice>&,
138 const size_t chosen_max_hashtable_size,
139 const double chosen_bucket_threshold);
143 const size_t shard_count,
144 const std::vector<double>& inverse_bucket_sizes_for_dimension,
145 std::vector<ColumnsForDevice>& columns_per_device,
146 const size_t chosen_max_hashtable_size,
147 const double chosen_bucket_threshold);
150 std::vector<ColumnsForDevice>& columns_per_device,
151 const size_t device_count);
163 return hash_table->getLayout();
173 const std::vector<JoinColumn>& join_columns,
174 const std::vector<JoinColumnTypeInfo>& join_column_types,
175 const std::vector<JoinBucketInfo>& join_bucket_info,
177 const size_t entry_count,
178 const size_t emitted_keys_count,
179 const bool skip_hashtable_caching);
182 std::shared_ptr<BaselineHashTable> initHashTableOnGpu(
183 const std::vector<JoinColumn>& join_columns,
184 const std::vector<JoinColumnTypeInfo>& join_column_types,
185 const std::vector<JoinBucketInfo>& join_bucket_info,
187 const size_t entry_count,
188 const size_t emitted_keys_count,
189 const size_t device_id);
191 std::shared_ptr<BaselineHashTable> copyCpuHashTableToGpu(
192 std::shared_ptr<BaselineHashTable>& cpu_hash_table,
194 const size_t entry_count,
195 const size_t emitted_keys_count,
196 const size_t device_id);
200 const size_t)
override;
203 const int device_id = 0,
204 bool raw =
false)
const override;
207 const int device_id)
const override;
219 return hash_table->getEntryCount();
225 return hash_table->getEmittedKeysCount();
232 return hash_table->getEntryCount() *
sizeof(int32_t);
244 const std::vector<InnerOuter>& inner_outer_pairs)
const;
251 return first_inner_col->get_rte_idx();
256 CHECK(key_component_width == 4 || key_component_width == 8);
259 return getEntryCount() * key_component_count * key_component_width;
261 return getEntryCount() * (key_component_count + 1) * key_component_width;
299 std::shared_ptr<HashTable> hashtable_ptr,
301 size_t hashtable_building_time);
323 auto inner_col = inner_outer.first;
325 auto outer_col = rhs_col_var ? rhs_col_var : inner_col;
326 boost::hash_combine(hash, inner_col->toString());
327 if (inner_col->get_type_info().is_string()) {
328 boost::hash_combine(hash, outer_col->toString());
332 boost::hash_combine(hash, info.
optype);
340 const size_t max_hashtable_size,
341 const double bucket_threshold,
342 const std::vector<double>& bucket_sizes,
343 std::vector<std::vector<Fragmenter_Namespace::FragmentInfo>>& fragments_per_device,
345 for (
int device_id = 0; device_id < device_count; ++device_id) {
347 boost::hash_combine(hash_val, max_hashtable_size);
348 boost::hash_combine(hash_val, bucket_threshold);
349 boost::hash_combine(hash_val, bucket_sizes);
350 boost::hash_combine(hash_val,
365 double bucket_threshold,
366 std::vector<double>& bucket_sizes) {
393 std::optional<HashType>
static std::vector< int > collectFragmentIds(const std::vector< Fragmenter_Namespace::FragmentInfo > &fragments)
llvm::Value * codegenKey(const CompilationOptions &)
static void markCachedItemAsDirty(size_t table_key)
const JoinType join_type_
const double bucket_threshold
virtual void reifyWithLayout(const HashType layout)
std::string toString(const ExecutorDeviceType device_type, const int device_id=0, bool raw=false) const override
virtual std::pair< size_t, size_t > approximateTupleCount(const std::vector< double > &inverse_bucket_sizes_for_dimension, std::vector< ColumnsForDevice > &, const size_t chosen_max_hashtable_size, const double chosen_bucket_threshold)
std::vector< InnerOuter > inner_outer_pairs
std::shared_ptr< HashTable > initHashTableOnCpuFromCache(QueryPlanHash key, CacheItemType item_type, DeviceIdentifier device_identifier)
shared::TableKey getInnerTableId() const noexceptoverride
std::pair< const Analyzer::ColumnVar *, const Analyzer::Expr * > InnerOuter
const TableIdToNodeMap table_id_to_node_map_
virtual void reifyImpl(std::vector< ColumnsForDevice > &columns_per_device, const Fragmenter_Namespace::TableInfo &query_info, const HashType layout, const size_t shard_count, const size_t entry_count, const size_t emitted_keys_count, const bool skip_hashtable_caching, const size_t chosen_max_hashtable_size, const double chosen_bucket_threshold)
size_t getEntryCount() const
const std::vector< double > inverse_bucket_sizes
std::string getHashJoinType() const final
int getInnerTableRteIdx() const noexceptoverride
static std::shared_ptr< OverlapsJoinHashTable > getInstance(const std::shared_ptr< Analyzer::BinOper > condition, const std::vector< InputTableInfo > &query_infos, const Data_Namespace::MemoryLevel memory_level, const JoinType join_type, const int device_count, ColumnCacheMap &column_cache, Executor *executor, const HashTableBuildDagMap &hashtable_build_dag_map, const RegisteredQueryHint &query_hint, const TableIdToNodeMap &table_id_to_node_map)
Make hash table from an in-flight SQL query's parse tree etc.
const RegisteredQueryHint & getRegisteredQueryHint()
std::vector< std::shared_ptr< HashTable > > hash_tables_for_device_
virtual ~OverlapsJoinHashTable()
std::optional< std::pair< size_t, size_t > > getApproximateTupleCountFromCache(QueryPlanHash key, CacheItemType item_type, DeviceIdentifier device_identifier)
static HashtableRecycler * getHashTableCache()
Data_Namespace::MemoryLevel getMemoryLevel() const noexceptoverride
static std::unique_ptr< OverlapsTuningParamRecycler > auto_tuner_cache_
void putHashTableOnCpuToCache(QueryPlanHash key, CacheItemType item_type, std::shared_ptr< HashTable > hashtable_ptr, DeviceIdentifier device_identifier, size_t hashtable_building_time)
std::shared_ptr< BaselineHashTable > initHashTableOnCpu(const std::vector< JoinColumn > &join_columns, const std::vector< JoinColumnTypeInfo > &join_column_types, const std::vector< JoinBucketInfo > &join_bucket_info, const HashType layout, const size_t entry_count, const size_t emitted_keys_count, const bool skip_hashtable_caching)
QueryPlanHash getCacheKey(int device_id) const
virtual std::pair< size_t, size_t > computeHashTableCounts(const size_t shard_count, const std::vector< double > &inverse_bucket_sizes_for_dimension, std::vector< ColumnsForDevice > &columns_per_device, const size_t chosen_max_hashtable_size, const double chosen_bucket_threshold)
HashType getHashType() const noexceptoverride
size_t calculateHashTableSize(size_t number_of_dimensions, size_t emitted_keys_count, size_t entry_count) const
const std::shared_ptr< Analyzer::BinOper > condition_
int getDeviceCount() const noexceptoverride
OverlapsJoinHashTable(const std::shared_ptr< Analyzer::BinOper > condition, const JoinType join_type, const std::vector< InputTableInfo > &query_infos, const Data_Namespace::MemoryLevel memory_level, ColumnCacheMap &column_cache, Executor *executor, const std::vector< InnerOuter > &inner_outer_pairs, const int device_count, const RegisteredQueryHint &query_hints, const HashTableBuildDagMap &hashtable_build_dag_map, const TableIdToNodeMap &table_id_to_node_map)
std::unordered_map< size_t, HashTableBuildDag > HashTableBuildDagMap
const size_t num_elements
void reify(const HashType preferred_layout)
void reifyForDevice(const ColumnsForDevice &columns_for_device, const HashType layout, const size_t entry_count, const size_t emitted_keys_count, const bool skip_hashtable_caching, const int device_id, const logger::ThreadLocalIds parent_thread_local_ids)
ColumnCacheMap & column_cache_
RegisteredQueryHint query_hints_
QueryPlanHash getAlternativeCacheKey(AlternativeCacheKeyForOverlapsHashJoin &info)
const std::vector< InputTableInfo > & query_infos_
const std::vector< InnerOuter > & getInnerOuterPairs() const
size_t payloadBufferOff() const noexceptoverride
DecodedJoinHashBufferSet toSet(const ExecutorDeviceType device_type, const int device_id) const override
HashTableBuildDagMap hashtable_build_dag_map_
std::vector< llvm::Value * > codegenManyKey(const CompilationOptions &)
std::vector< QueryPlanHash > hashtable_cache_key_
QueryPlanDAG query_plan_dag_
static OverlapsTuningParamRecycler * getOverlapsTuningParamCache()
void setOverlapsHashtableMetaInfo(size_t max_table_size_bytes, double bucket_threshold, std::vector< double > &bucket_sizes)
HashTable * getHashTableForDevice(const size_t device_id) const
std::unordered_map< shared::TableKey, const RelAlgNode * > TableIdToNodeMap
double chosen_overlaps_bucket_threshold_
std::vector< double > inverse_bucket_sizes_for_dimension_
static void invalidateCache()
std::optional< HashType > layout_override_
llvm::Value * codegenSlot(const CompilationOptions &, const size_t) override
std::set< DecodedJoinHashBufferEntry > DecodedJoinHashBufferSet
const size_t chunk_key_hash
void setInverseBucketSizeInfo(const std::vector< double > &inverse_bucket_sizes, std::vector< ColumnsForDevice > &columns_per_device, const size_t device_count)
ColumnsForDevice fetchColumnsForDevice(const std::vector< Fragmenter_Namespace::FragmentInfo > &fragments, const int device_id, DeviceAllocator *dev_buff_owner)
size_t getKeyComponentCount() const
std::unordered_map< shared::TableKey, std::unordered_map< int, std::shared_ptr< const ColumnarResults >>> ColumnCacheMap
HashJoinMatchingSet codegenMatchingSet(const CompilationOptions &, const size_t) override
size_t offsetBufferOff() const noexceptoverride
size_t countBufferOff() const noexceptoverride
size_t shardCount() const
HashtableCacheMetaInfo hashtable_cache_meta_info_
std::mutex cpu_hash_table_buff_mutex_
const Data_Namespace::MemoryLevel memory_level_
void generateCacheKey(const size_t max_hashtable_size, const double bucket_threshold, const std::vector< double > &bucket_sizes, std::vector< std::vector< Fragmenter_Namespace::FragmentInfo >> &fragments_per_device, int device_count)
size_t getEmittedKeysCount() const
size_t getComponentBufferSize() const noexceptoverride
static std::unique_ptr< HashtableRecycler > hash_table_cache_
std::optional< OverlapsHashTableMetaInfo > getOverlapsHashTableMetaInfo()
std::vector< InnerOuter > inner_outer_pairs_
std::unordered_set< size_t > table_keys_
const size_t max_hashtable_size
static size_t getShardCountForCondition(const Analyzer::BinOper *condition, const Executor *executor, const std::vector< InnerOuter > &inner_outer_pairs)
Data_Namespace::MemoryLevel getEffectiveMemoryLevel(const std::vector< InnerOuter > &inner_outer_pairs) const
static constexpr DeviceIdentifier CPU_DEVICE_IDENTIFIER
CompositeKeyInfo composite_key_info_
size_t getKeyComponentWidth() const
bool isBitwiseEq() const override
size_t getKeyBufferSize() const noexcept
static bool layoutRequiresAdditionalBuffers(HashType layout) noexcept
size_t chosen_overlaps_max_table_size_bytes_