---
title: 0.25.1
noindex: true
---

<Warning>
  **Breaking change:** `0.25.1` replaces the vector search engine's epsilon
  recall knob with a proof-based bounds gate. The
  `paradedb.vector_cluster_probe_epsilon` GUC has been removed, and vector
  indexes built with `0.25.0` must be rebuilt with `REINDEX` after upgrading.
</Warning>

## New Features 🎉

### Faster Vector Search, One Less Knob

Vector search now uses a proof-based bounds gate with a work budget, which skips clusters that provably cannot
contribute to the result. This cuts tail latency by up to 6x and produces much tighter recall/latency confidence
intervals.

Because the gate is proof-based, there is no longer a recall knob to misconfigure: `paradedb.vector_cluster_max_probe`,
the work-budget ceiling, is now the only [recall/latency setting](/documentation/vector/tuning).

### Deterministic Vector Search Results

Tiebreaker columns can now follow the distance in `ORDER BY`, making [vector search results deterministic](/documentation/vector/querying#deterministic-results)
when embeddings are equidistant from the query vector:

```sql
SELECT id, description
FROM mock_items
WHERE id @@@ pdb.all()
ORDER BY embedding <=> '[1, 2, 3, 4, 5, 6, 7, 8]', id
LIMIT 5;
```

### Vector Search in Hybrid Queries

The vector arm of [reciprocal rank fusion](/documentation/hybrid/rrf) queries is now pushed down into the ParadeDB
index, accelerating hybrid search.

### ORM Support for Vector Search

The ParadeDB ORM integrations have been updated for the `paradedb` index naming, native vector search, and the
vector index build options:

- [sqlalchemy-paradedb](https://pypi.org/project/sqlalchemy-paradedb/) `0.10.0`
- [django-paradedb](https://pypi.org/project/django-paradedb/) `0.12.0`
- [rails-paradedb](https://rubygems.org/gems/rails-paradedb) `0.11.0`
- [@paradedb/drizzle-paradedb](https://www.npmjs.com/package/@paradedb/drizzle-paradedb) `0.4.0`
- [ParadeDB.EntityFrameworkCore](https://www.nuget.org/packages/ParadeDB.EntityFrameworkCore) `0.3.0`

### LEFT, RIGHT, and FULL Joins

JoinScan now supports `LEFT`, `RIGHT`, and `FULL` joins, extending the join shapes that execute inside the
ParadeDB index.

## Performance Improvements 🚀

- Vector index builds hand training vectors to the clusterer by value, halving training memory.
- Vector index build parallelism is capped at 4 workers to prevent memory spikes on large builds.
- A new `paradedb.vector_clustering_threshold` GUC (default `500`) sets the segment size at which vector storage
  switches from flat to clustered.
- MPP workers now launch plan-first, sized from the plan's task fragments, and the default ring size was lowered
  to 8MB.
- Range partitioning is now wired into join planning.

## Stability Improvements 💪

- AggregateScan join predicates are now normalized and validated.
- Fixed a spurious `datetime_fields` error.
- Dynamic filters now survive across MPP fragments.
- The extension Docker image now ships `pg_search`'s non-base shared libraries.
- Multi-valued fields are now disallowed in `partition_by` and `sort_by`.

The full changelog is available [on the GitHub Release](https://github.com/paradedb/paradedb/releases/tag/v0.25.1).
