2012-08-22 17 views
5

È possibile inserire più entità in DB con una singola query? Quando uso un esempio da here posso vedere diverse query nel Debugger WebDoctrine2 Inserto batch

AGGIORNAMENTO 23.08.2012

ho trovato i seguenti link correlati. Spero che vi aiuterà a qualcuno per capire un elaborazione batch:

  1. http://www.doctrine-project.org/blog/doctrine2-batch-processing.html
  2. doctrine2 - How to improve flush efficiency?
  3. Doctrine 2: weird behavior while batch processing inserts of entities that reference other entities

Le cose principali:

Alcune persone sembrano chiedersi perché Doctrine non usa i multi-inserti (inserisci in (...) valori (...), (...), (...), ...

Prima di tutto, questa sintassi è supportata solo su versioni mysql e più recenti di postgresql. In secondo luogo, non esiste un modo semplice per accedere a tutti gli identificatori generati in tale multi-insert quando si utilizza AUTO_INCREMENT o SERIAL e un ORM ha bisogno degli identificatori per la gestione degli oggetti dell'identità . Infine, inserire le prestazioni è raramente il collo di bottiglia di un ORM. Gli inserti normali sono più che veloci per la maggior parte delle situazioni e se vuoi veramente fare inserimenti veloci, allora un multi-insert non è il modo migliore, cioè Postgres COPY o Mysql LOAD DATA INFILE sono diversi ordini di grandezza più veloce .

Questi sono i motivi per cui non vale la pena di implementare un'astrazione che esegue multi-inserimenti su mysql e postgresql in un ORM. Spero che chiarisca alcuni punti interrogativi.

risposta

0

Penso che ci saranno diverse istruzioni di inserimento, ma solo una query al database per chiamata "flush".

Come accennato qui http://doctrine-orm.readthedocs.org/en/2.0.x/reference/working-with-objects.html

Ogni "persistere" aggiungerà un'operazione alla corrente UnitOfWork, allora è la chiamata a EntityManager # flush(), che in realtà scrivere nel database (incapsulare tutte le operazioni di the UnitOfWork in una singola transazione).

Ma non ho controllato che il comportamento che descrivo sopra sia il comportamento reale.

Con i migliori saluti, Christophe

+0

Grazie per la risposta, ma non sono sicuro che 'solo una query al database per call' "a filo", perché posso vedere un tempo di esecuzione per ogni istruzione INSERT . Significa che ogni istruzione INSERT è una query su DB. Ho aggiornato la mia domanda – Mikhail