Jednym z podejść do takich problemów może być robienie tego w mniejszych porcjach.
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
);
Opłucz, powtórz. Eksperymentuj z różnymi rozmiarami porcji, aby znaleźć optymalny dla swojego zestawu danych, który używa najmniejszej liczby zapytań, zachowując je wszystkie w pamięci.
Oczywiście chciałbyś to skryptować, prawdopodobnie w plpgsql lub w dowolnym preferowanym języku skryptowym.