agora inbox for pgsql-bugs@postgresql.org
help / color / mirror / Atom feedFrom: PG Bug reporting form <noreply@postgresql.org>
To: pgsql-bugs@lists.postgresql.org
Cc: 2320415112@qq.com
Subject: BUG #19568: Redundant outer DISTINCT adds Sort and Unique above INTERSECT
Date: Wed, 22 Jul 2026 06:51:33 +0000
Message-ID: <19568-cc05e88af2b80bd1@postgresql.org> (raw)
The following bug has been logged on the website:
Bug reference: 19568
Logged by: cl hl
Email address: 2320415112@qq.com
PostgreSQL version: 17.10
Operating system: Linux LAPTOP-2SQAVLB0 6.6.87.2-microsoft
Description:
## Description
This issue concerns an outer `DISTINCT` applied to an `INTERSECT` result.
Since non-`ALL` `INTERSECT` already returns duplicate-free rows, the outer
operation cannot change the result. PostgreSQL nevertheless performs a
second deduplication.
### Expected Behaviour
PostgreSQL should propagate the uniqueness guarantee from `INTERSECT` and
remove the outer `DISTINCT`. Both equivalent forms should use the same plan
and have comparable execution times.
### Actual Behaviour
The outer `DISTINCT` adds `Sort -> Unique` above `HashSetOp Intersect`. With
two 500,000-row inputs and 250,000 result rows, five-run median execution
time increased from 176.081 ms to 191.225 ms, approximately 8.6%.
## How to repeat
```sql
DROP TABLE IF EXISTS intersect_distinct_lhs;
DROP TABLE IF EXISTS intersect_distinct_rhs;
CREATE TABLE intersect_distinct_lhs (v INTEGER NOT NULL);
CREATE TABLE intersect_distinct_rhs (v INTEGER NOT NULL);
INSERT INTO intersect_distinct_lhs
SELECT g FROM generate_series(1, 500000) AS g;
INSERT INTO intersect_distinct_rhs
SELECT g FROM generate_series(250001, 750000) AS g;
ANALYZE intersect_distinct_lhs;
ANALYZE intersect_distinct_rhs;
EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS, TIMING OFF)
SELECT DISTINCT v
FROM (
SELECT v FROM intersect_distinct_lhs
INTERSECT
SELECT v FROM intersect_distinct_rhs
) AS set_result;
EXPLAIN (ANALYZE, BUFFERS, VERBOSE, SETTINGS, TIMING OFF)
SELECT v
FROM (
SELECT v FROM intersect_distinct_lhs
INTERSECT
SELECT v FROM intersect_distinct_rhs
) AS set_result;
```
Both queries return the same 250,000 rows. The characteristic plans are:
```text
with DISTINCT: Unique -> Sort -> HashSetOp Intersect
without: HashSetOp Intersect
```
Message-ID: <19568-cc05e88af2b80bd1@postgresql.org>
Permalink: ../19568-cc05e88af2b80bd1@postgresql.org/
Also on: postgresql.org/message-id/19568-cc05e88af2b80bd1@postgresql.org
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: noreply@postgresql.org, pgsql-bugs@lists.postgresql.org, 2320415112@qq.com
Subject: Re: BUG #19568: Redundant outer DISTINCT adds Sort and Unique above INTERSECT
In-Reply-To: <19568-cc05e88af2b80bd1@postgresql.org>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox