New Features ✨
-
Added
pdb.combine_agg(pdb.agg(...)) OVER ()(and accompanyingCOUNT,SUM,AVG,MIN, andMAXOVER ()window aggregate pushdown) to compute global facets and aggregates across all groups inGROUP BYqueries (#6806). -
Search operators (
|||,&&&,@@@) inside aggregateFILTER (WHERE ...)clauses are now pushed down for aggregates over joins and other DataFusion-backed aggregates (#6819).
Performance Improvements 🚀
-
Predicates the index cannot answer, such as a UDF over non-indexed columns, now run only on the
rows the
@@@predicates matched, in the Aggregate Scan and the Join Scan as well as the Base Scan. ACOUNT(*)with such a predicate no longer reads every row of the table. Several such predicates in oneWHEREclause run one after the other, so the index is read once and the BM25 score is no longer multiplied by their number. -
Join Scan now computes global window aggregates (
COUNT(*),SUM,AVG,MIN, andMAXwith an emptyOVER ()) in the same aggregate step as theORDER BY ... LIMITTop-K, instead of a separate window pass over every join row followed by a sort. The join runs once, and under parallel execution each worker aggregates its share of the rows while the leader merges the results. A query whoseLIMITis not known at plan time, such as a generic plan with a parameter, keeps the window pass. -
Added posting bitmaps, enabled by default, to speed up eligible count queries combining common search terms with
ANDorOR. Disable bitmap storage per field withbitmap_postings=false, or disable its use during queries withparadedb.enable_bitmap_postings = offwithout rebuilding the index. -
Significantly improved Join Scan performance for hash joins with larger build sides by applying
IN-list dynamic filters against fast fields before heap visibility checks and column materialization.
Stability Improvements 💪
-
Prepared statements no longer fail on the
&&&,|||and###operators when the right-hand side is apdb.queryvalue (for examplepdb.fuzzy) and Postgres switches to a generic plan. A finishedpdb.queryon the right-hand side of these operators and===is now rejected the same way under generic and custom plans, and atext[]cast topdb.fuzzywithout a typmod no longer fails the match array assertion on&&&and|||. -
Fixed an issue where shared buffer and WAL statistics from parallel workers were underreported under MPP query plans (
JoinScanandAggregateScan). Background workers launched through the custom parallel process builder now record their buffer accesses and WAL activity in shared memory, and the leader aggregates these statistics intoEXPLAIN (ANALYZE, BUFFERS)andpg_stat_statements. - Fixed a primary being unable to complete a fast shutdown while a background merge worker waited for a missing synchronous standby. Merge workers now commit locally, as autovacuum does (#6708).
-
A parallel search with a bitmap intersection no longer crashes a parallel worker, fails with
bitmap cursor source was never initialized, or returns wrong rows when itsGatherorGather Mergeis rescanned, for example inside a correlated subquery (#6734). The workers of a rescanned parallel search now see the round’s parameter values instead of keeping the first round’s (#6790). -
Fixed small indexes never merging their segments when every background layer was larger than the target segment size, which the default
target_segment_countcauses on hosts with many cores (#6760). - A range filter now adds its constant 1.0 to the score on every segment, so rows that match a text clause and the range equally rank the same regardless of segment layout (#6674). Before, a segment the range fully covered scored 1.0 lower than a segment it only partly covered, and Top K on the fully covered segment could not use Block-WAND.
-
Fixed
pdb.agg(...) OVER ()over a join failing withpdb.agg() must be handled by ParadeDB's custom scanwhen itsLIMITorOFFSETis a parameter, as in a prepared statement under a generic plan (#6712). Join Scan now resolves the parameter when the query runs, so these queries, and global window aggregates such asCOUNT(*) OVER ()with a parameterizedLIMIT, compute their window aggregates in the same aggregate step as the Top-K.