Ich arbeite an einem Import von 300000 Reihe in vielen CSV.Lehre einfügen viele Daten
Zuerst nehme ich CSV und importiere jede Zeile in eine Tabelle innerhalb meiner Datenbank.
Nachdem ich alle Zeile analysieren und einfügen in die richtige Tabelle mit einer Beziehung, dass Daten.
Ich habe dies so versucht:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->getQuery()
->getResult();
$countRows = 0;
foreach ($flows as $row) {
//some check
$entity = new TestTable();
$entity->setCode($row->getCode());
//many other fields
$this->entityManager->persist($entity);
$this->entityManager->flush();
}
In diesem Fall werden alle Verfahren dauerte etwa 5 Sekunden für jede Zeile!
Jetzt Wenn ich hinzufügen setMaxResults wie folgt aus:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->setMaxResults(100)
->getQuery()
->getResult();
Es dauerte weniger als 1 Sekunde!
Also habe ich gedacht, alle Zeilen zu erhalten und teilen Sie es in eine rekursive Funktion mit setMaxResult wie folgt aus:
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->getQuery()
->getResult();
$countFlows = count($flows);
$numberOfQuery = $countFlows/100;
for ($i = 0; $i <= $numberOfQuery; $i++) {
$this->entityManager->clear();
$qb = $this->entityManager->createQueryBuilder();
$flows = $qb->select('flow')
->from('AppBundle:FlowAndata', 'flow')
->setFirstResult($i * 100)
->setMaxResults(100)
->getQuery()
->getResult();
}
Auf diese Weise habe ich viele Abfrage erstellen in 100 Zeilen aufgeteilt. Ist eine gute Übung oder gibt es eine bessere Möglichkeit, viele Zeilen zu analysieren und eine Einfügung von It machen?
Groß Es funktioniert mehr schneller! Danke –