Tengo dos tablas en una base de datos que se vacían y reemplazan con mucha frecuencia. Cada tabla tiene más de 65.000 filas. Quiero seleccionar dos campos de la primera tabla ( LnsPriceUpdates ), luego tomar esos valores y compararlos e insertarlos en la segunda tabla ( LnsCatalog ) y quiero hacer esto para los 65 000 elementos de la base de datos.
(Nota: quiero hacer todo esto desde un host local)
Aquí está el código actual que estoy usando:
public function testbananaAction() { $em = $this->getDoctrine()->getManager(); $query = $em ->createQuery( 'SELECT l.partnumber, l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL' ) ->getResult(); foreach ($query as $row){ $partNo = $row['partnumber']; $part = $em->getRepository('AppBundle:Lnscatalog') ->findOneBy(['partnoid' => $partNo]); $dealerCost = $row['level1Net']; if(isset($dealerCost) && isset($part)){ $partCheck = $part->getDealerCost(); if(!isset($partCheck)){ $part->setDealerCost($dealerCost); $em->flush(); } } else { continue; } } return new Response('yay'); }Cualquier idea para realizar esta tarea sin fallar sería útil.
¿Puedes lograr con una sola actualización Sql algo como:
update Lnscatalog c set c.dealerCost = (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid) where c.dealerCost is null and exists (SELECT l.level1Net FROM AppBundle:LnsPriceUpdates l WHERE l.level1Net IS NOT NULL and l.partnumber=c.partnoid)Puede acelerar esta consulta agregando algún índice en la tabla anterior, como ejemplo:
ALTER TABLE LnsPriceUpdates ADD INDEX LnsPriceUpdates_IDX_1 (level1Net, partnumber) ; ALTER TABLE LnsPriceUpdates ADD INDEX LnsPriceUpdates_IDX_2 (partnumber) ; ALTER TABLE Lnscatalog ADD INDEX Lnscatalog_IDX_2 (dealerCost) ;Se pueden encontrar algunas referencias sobre la optimización de consultas SQL aquí , aquí y aquí
Espero que esto ayude