Skip to main content
ParadeDB supports all standard Postgres JOIN types, including:
  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL JOIN
  • SEMI JOIN
  • ANTI JOIN
  • CROSS JOIN
ParadeDB optimizes standard JOIN queries involving search operations through a feature called join pushdown. Our goal is to support and accelerate all JOIN queries shaped like Top-K or aggregate queries. Because join pushdown is enabled by default, ParadeDB automatically executes parts of a JOIN directly inside the ParadeDB executor for queries that meet the requirements. If a query does not meet the requirements, ParadeDB falls back to Postgres’s native row-based execution.

Join Pushdown

Join pushdown reduces query latency by answering as much of the query as possible using the index before touching the underlying tables.
To disable join pushdown for debugging, run SET paradedb.enable_join_custom_scan TO off;.

Requirements for Join Pushdown

Join pushdown is automatically used when a query meets several conditions. If any of these are not satisfied, Postgres will simply execute the join normally. If any checks fail, ParadeDB will emit a NOTICE explaining why and fall back to Postgres’ native join execution. To demonstrate, let’s create a second table called orders that can be joined with mock_items:
Expected Response

Supported Join Types

Inner Join

An inner join returns rows where a matching row exists in both tables according to the join condition.
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Semi Join

A semi join returns rows from the left table when a matching row exists in the right table. In SQL, this usually appears as an IN or EXISTS query:
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Anti Join

An anti join returns rows from the left table when no matching row exists in the right table. This typically appears as NOT EXISTS or NOT IN.
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Left Join

A left join returns all rows from the left table and matching rows from the right table.
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Right Join

A right join returns all rows from the right table and matching rows from the left table.
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Full Join

A full join returns all rows when there is a match in either the left or the right table.
Expected Response
To verify join pushdown, run EXPLAIN on the query and look for a ParadeDB Join Scan in the output.
Expected Response

Partitioned Joins (Beta)

Partitioned joins are currently a Beta feature under active development.
When both tables in an equi-join are indexed using partition_by on their join keys, ParadeDB automatically joins matching partition ranges locally on each worker without exchanging data between processes. See the Partitioning Guide for setup and column selection advice.

Performance

If your join query isn’t as fast as you’d like, we invite you to open a GitHub issue.