Une approche à des problèmes comme celui-ci peut être de le faire en plus petits morceaux.
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
);
Rincer, répéter. Expérimentez avec différentes tailles de blocs pour en trouver une optimale pour votre ensemble de données, qui utilise le moins de requêtes, tout en les gardant toutes en mémoire.
Naturellement, vous voudriez le scripter, éventuellement en plpgsql, ou dans le langage de script que vous préférez.