Правите го правилно – просто е бавно, защото добавената абстракция на ORM означава, че не можете да правите видовете оптимизации, които искате.
Въпреки това EntityManager се забавя при толкова големи транзакции. Ако не ви трябват всички в една голяма транзакция, вероятно можете да получите по-ефективен код чрез flush()ing и след това изчистване() на EM на всеки 20-200 повторения на вашия цикъл.
Ако това не ви осигури достатъчно производителност, единствената алтернатива, за която се сещам, е да се върнете към персонализиран код, който изпълнява персонализиран SQL директно срещу вашата СУБД.
Знам, че това не е страхотен отговор, но поне мога да ти кажа, че не си луд.
------ редактиране ------
От официалната статия на Doctrine2 за Пакетна обработка
:
Също така има значителна разлика в производителността при използване на отдалечено спрямо локално база данни, тъй като режийните разходи за изпращане на всяка заявка до отдалечен сървър са доста големи. Разходите са много по-ниски при използване на локална база данни благодарение на транзакции и оптимизации на DB. (напр. 70 секунди намалено до 300 мс в случая на примера във въпроса)