Re: where not exists

From: Jie Liang <jie(at)stbernard(dot)com>
To: 'Llew' <postgres(at)lg(dot)ndirect(dot)co(dot)uk>, pgsql-sql(at)postgresql(dot)org
Subject: Re: where not exists
Date: 2002-03-06 20:29:33
Message-ID: 7C760DAA511DC74B99E7D22189F786F1906D98@MAIL01.stbernard.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-sql

set operation especially NOT EXIST is very slow(for big table),
I recommand you use a few queries for your propose:
1. select * into c from a where join1=b.join1 and join2=b.join2;
2. truncate table a;
3. insert into a select * from c;
4. drop table c;

You don't need index c since you use full table scan anyway.

Jie Liang

-----Original Message-----
From: Llew [mailto:postgres(at)lg(dot)ndirect(dot)co(dot)uk]
Sent: Wednesday, March 06, 2002 11:28 AM
To: pgsql-sql(at)postgresql(dot)org
Subject: [SQL] where not exists

Dear everyone,
What is the best way of removing rows which are not in another table?

I have these two tables each with millions of rows/tuples.
They are joined on two fields:
CREATE TABLE a
(
join1 OID,
join2 OID,
--a fair number of other fields
.....
)
CREATE TABLE b
(
join1 OID,
join2 OID,
--a fair number of other fields
.....
)
There are indices on both of them (on "join1, join2").
At the moment, I am doing

1) get items which are orphaned in a.
CREATE TEMP TABLE orphans as
SELECT join1, join2
FROM a
WHERE NOT EXISTS
(
SELECT *
FROM b
WHERE
a.join1 = b.join1 AND
a.join2 = b.join2
)
2) DELETE FROM a where orphans.join1 = a.join1 and orphans.join2=a.join2
3) DROP TABLE orphans

This is very slow. Is there a better way?
Should I first copy all join1. join2 from a and b into temporary tables
first?
Do I need to index the temporary tables?
Surely this is a general enough a problem that optimal sets of solutions
exists in people's experience.
Thanks a lot.

Llew

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
message can get through to the mailing list cleanly

Responses

Browse pgsql-sql by date

  From Date Subject
Next Message Llew 2002-03-06 20:54:15 Re: where not exists
Previous Message Josh Berkus 2002-03-06 20:25:30 Re: where not exists