Ett sätt att hantera problem som detta kan vara att göra det i mindre bitar.
DELETE FROM "contacts"
WHERE "contacts"."id" IN (
SELECT id
FROM contacts
LEFT OUTER JOIN members ON members.contact_id = contacts.id
WHERE members.id IS NULL
AND id >= 1 AND id < 1000
);
DELETE FROM "contacts"
WHERE "contacts"."id" IN (
SELECT id
FROM contacts
LEFT OUTER JOIN members ON members.contact_id = contacts.id
WHERE members.id IS NULL
AND id >= 1001 AND id < 2000
);
Skölj, upprepa. Experimentera med olika chunkstorlekar för att hitta en optimal för din datamängd, som använder minsta möjliga frågor, samtidigt som alla behålls i minnet.
Naturligtvis skulle du vilja skripta detta, möjligen i plpgsql, eller på vilket skriptspråk du föredrar.