From: | PG Bug reporting form <noreply(at)postgresql(dot)org> |
---|---|
To: | pgsql-bugs(at)lists(dot)postgresql(dot)org |
Cc: | g(dot)fouet(at)gmail(dot)com |
Subject: | BUG #17590: [OPTIMIZER] DELETE never ends on a small table, found a workaround which makes it instant |
Date: | 2022-08-19 15:13:59 |
Message-ID: | 17590-80fab927fee1ddf2@postgresql.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
The following bug has been logged on the website:
Bug reference: 17590
Logged by: Guillaume FOUET
Email address: g(dot)fouet(at)gmail(dot)com
PostgreSQL version: 14.5
Operating system: Windows 10 - 64x
Description:
Tested with Postgres 13.5, 13.8 and 14.5 (I updated to see if that was a
bug).
I have four tables: ADDRESS, COMPANY, CONTACT, TRIP
ADDRESS has ~130000 rows
COMPANY has a FK toward ADDRESS and ~16000 rows
CONTACT has a FK toward ADDRESS and ~12000 rows
TRIP has a FK toward ADDRESS and ~137500 rows
We wanted to purge the address table from old, unused addresses:
DELETE FROM address WHERE address_id NOT IN (
SELECT DISTINCT address_id FROM company
UNION
SELECT DISTINCT address_id FROM contact
UNION
SELECT DISTINCT address_id FROM trip
);
This query above never ends (I waited 15 minutes and it was still going, HDD
doing nothing, one core CPU used).
The EXPLAIN says it materializes the address_ids aggregates then scans
ADDRESS for deletion.
After many tries, I made this query instead:
CREATE TEMPORARY TABLE used_address_id AS (
SELECT DISTINCT address_id FROM company
UNION
SELECT DISTINCT address_id FROM contact
UNION
SELECT DISTINCT address_id FROM trip
);
CREATE UNIQUE INDEX ON used_address_id (address_id);
DELETE FROM used_address_id WHERE address_id IS NULL;
DELETE FROM address WHERE address_id NOT IN (SELECT address_id FROM
used_address_id);
This was resolved in 500ms (basically instantly).
I have the feeling there's an O(n²) somewhere in the first query.
Thanks.
From | Date | Subject | |
---|---|---|---|
Next Message | Tomas Vondra | 2022-08-19 16:17:45 | Re: BUG #17590: [OPTIMIZER] DELETE never ends on a small table, found a workaround which makes it instant |
Previous Message | Bruce Momjian | 2022-08-19 14:21:00 | Re: BUG #17233: Incorrect behavior of DELETE command with bad subquery in WHERE clause |