--- title: 0.25.4 noindex: true --- ## New Features 🎉 - Added support for aggregate score joins, enabling queries to `ORDER BY` a sum of scores across joined tables. - Added `paradedb.vector_clusters` to inspect per-cluster posting list sizes and ball-bound radii for vector indexes. ## Performance Improvements 🚀 - Cross-table disjunctive search predicates (e.g. `a.text @@@ 'foo' OR b.text @@@ 'bar'`) now evaluate via predicate tagging rather than UDFs, improving low-selectivity disjunctive join query performance by up to 22x. - MPP self-loops across stages on the same worker now communicate over an in-memory channel, eliminating in-process serialization overhead. - Dynamic shared memory (DSM) allocation for parallel index scans on PostgreSQL 15–17 now sizes EXPLAIN info slots only when used, reducing shared memory overhead from ~66MB to ~2MB. - Eliminated redundant eager planning passes in AggregateScan and JoinScan, sizing DSM allocations directly from physical stages. - Gate MPP execution behind a minimum row count, configurable via `paradedb.mpp_min_rows`. ## Stability Improvements 💪 - Parallel MPP worker scans and leader consumers now replay the leaders's segment view and mutable segment bounds. - AggregateScan now validates collation semantics during `GROUP BY` pushdown, falling back to PostgreSQL for non-deterministic collations and `GROUPING SETS`. - Plain `EXPLAIN` now matches runtime behavior by rendering the serial execution plan when task discovery finds fewer than 2 parallel tasks. - Dynamic filter pushdown is now tracked and reported via metrics across MPP execution stages. - `EXPLAIN` plans for the aggregate and join scan now display the table name or alias. ## New Contributors 👋 - [**aryanpatel-ctrl**](https://github.com/aryanpatel-ctrl) The full changelog is available [on the GitHub Release](https://github.com/paradedb/paradedb/releases/tag/v0.25.4).