Един подход към проблеми като този може да бъде да го направите на по-малки парчета.
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
);
Изплакнете, повторете. Експериментирайте с различни размери на парчета, за да намерите оптимален за вашия набор от данни, който използва най-малко заявки, като същевременно ги запазва в паметта.
Естествено, бихте искали да го скриптирате, евентуално на plpgsql или на който и да е скриптов език, който предпочитате.