Accelerate multi-join queries with adaptive predicate transfer
Compatibility Matrix
This table covers all DuckDB releases that have not reached end-of-life, including LTS releases, and shows the 2 most recent patch releases of each. Older patch releases are not listed, but the extension may be available for them as well.
| Platform | 1.4.4 | 1.4.5 | 1.5.5 | 1.5.6 | 2.0.0 |
|---|---|---|---|---|---|
| Linux AMD64 | |||||
| Linux ARM64 | |||||
| macOS AMD64 | |||||
| macOS ARM64 | |||||
| Windows AMD64 | |||||
| Windows ARM64 | |||||
| WebAssembly |
Installing and Loading
INSTALL bloom FROM community;
LOAD bloom;
Example
LOAD bloom;
SELECT current_setting('enable_bloom'); -- true
About bloom
Bloom is an optimizer extension for analytical queries that join multiple tables. It extends robust predicate transfer (RPT), combining sampling with execution feedback to reduce the data processed by joins. Loading Bloom enables the optimizer automatically; existing SQL and query results stay the same.
This release targets DuckDB v2.0.0. See the README for benchmarks and configuration and logging for usage details.
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| __internal_bloom_rpt_filter | scalar | NULL | NULL | |
| bloom_preload_samples | table | NULL | NULL |
Overloaded Functions
This extension does not add any function overloads.
Added Types
This extension does not add any types.
Added Settings
| name | description | input_type | scope | aliases | typed_value |
|---|---|---|---|---|---|
| bloom_excitation_mode | Repeated-transfer information criterion: 'table_size' or exact 'join_key_ndv' equality domains | VARCHAR | GLOBAL | [] | table_size |
| bloom_excitation_threshold | Re-excite below this fraction of the preceding cardinality | DOUBLE | GLOBAL | [] | 1.0 |
| bloom_instant_access | Native-storage instant access policy: 'scattered' (resident data) or 'block' (cold data) | VARCHAR | GLOBAL | [] | scattered |
| bloom_instant_access_points | Stratified access points used by scattered instant sampling | UBIGINT | GLOBAL | [] | 256 |
| bloom_instant_block_windows | Block-aligned windows used by cold instant sampling | UBIGINT | GLOBAL | [] | 16 |
| bloom_instant_parquet_row_groups | Stratified Parquet row groups sampled per table | UBIGINT | GLOBAL | [] | 8 |
| bloom_instant_rows_per_access | Contiguous rows decoded at each scattered access point | UBIGINT | GLOBAL | [] | 32 |
| bloom_instant_snapshot | Use the active transaction snapshot for native instant samples instead of direct base-storage reads | BOOLEAN | GLOBAL | [] | false |
| bloom_late_materialize | Experimental: materialize transfer keys and row IDs, then filter the original table scan | BOOLEAN | GLOBAL | [] | false |
| bloom_log_transfer_steps | Log the transfer plan to stderr for debugging | BOOLEAN | GLOBAL | [] | false |
| bloom_memory_limit | Maximum in-memory budget for optimizer-time Bloom work ('auto' uses 25% of available operator memory) | VARCHAR | GLOBAL | [] | auto |
| bloom_sample_cache_dir | Prepared-sample cache directory ('auto' stores it beside the database) | VARCHAR | GLOBAL | [] | auto |
| bloom_sample_memory_cache | Cache prepared samples in the process object cache to skip disk reloads across queries (advanced) | BOOLEAN | GLOBAL | [] | true |
| bloom_sample_mode | Base-table sampling mode: 'prepared' or 'instant' | VARCHAR | GLOBAL | [] | prepared |
| bloom_sample_rate | Chunk-sampling fraction for estimating cardinalities of already-materialized intermediate data | DOUBLE | GLOBAL | [] | 0.01 |
| bloom_sample_seed | Reproducible base-table sample seed | UBIGINT | GLOBAL | [] | 2 |
| bloom_sample_size | Target rows for prepared, block, and Parquet sampling | UBIGINT | GLOBAL | [] | 10000 |
| enable_bloom | Enable the Bloom optimizer | BOOLEAN | GLOBAL | [] | true |
| temp_directory | Set the directory to which temporary files are written. | VARCHAR | GLOBAL | [] | post.db.tmp |