このような問題への1つのアプローチは、より小さなチャンクでそれを行うことです。
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で、または任意のスクリプト言語でこれをスクリプト化することをお勧めします。