Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Insert de miles de registros muy lento

Estas en el tema de Insert de miles de registros muy lento en el foro de PHP en Foros del Web. Buenas tardes; Actualmente ejecuto una consulta a Oracle que puede tener más o menos un millon de registros y luego pretengo almacenarla en mysql, el ...
  #1 (permalink)  
Antiguo 10/12/2018, 12:27
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Información Insert de miles de registros muy lento

Buenas tardes;

Actualmente ejecuto una consulta a Oracle que puede tener más o menos un millon de registros y luego pretengo almacenarla en mysql, el problema es que cuando consulto sin guardar la respuesta es muy buena en tiempo pero cuando le agrego el insert los tiempos aumentan a tan alto nivel que me hace inviable la solución.

con este foreach recorro la consulta pero cuando descomento el insert es donde ocurre la lentitud, ¿existe una forma más eficiente? supongo que esto ya debe estar cubierto con otro metodo.

Código PHP:
Ver original
  1. foreach ($datosarray as $consultaopen)
  2. {
  3.         //mysqli_query($conn,"INSERTT INTO mesanterior (ss,cargdoso) VALUES ('".$consultaopen['cod']."','".$consultaopen['desc']."')";
  4.  
  5. }

  #2 (permalink)  
Antiguo 10/12/2018, 14:26
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Insert de miles de registros muy lento

Una opción mucho mas óptima sería concatenar en una variable php varios inserts al mismo tiempo.

Con esto, en cada ejecución y viaje a la base de datos, estarías ejecutando muchas sentencias al tiempo.

Otra opción, podría ser haciendo uso de transacciones. En grandes ejecuciones de datos, el autocommit empieza a ser un dolor de cabeza en la ejecución de este tipo de sentencias.

Saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 10/12/2018, 15:32
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Mensaje Respuesta: Insert de miles de registros muy lento

huesos gracias, pregunta, hice esto pero me arroja error, que estoy haciendo mal?, con esto estoy tratando de ingresar varios insert.

Notice: Array to string conversion in C:\Users\xxx\Desktop\prueba\USBWebserver v8.6\root\cargos\index2.php on line 97

Código PHP:
Ver original
  1. foreach ($datosarray as $a=>$b){
  2.     $query = "INSERT INTO mesanterior VALUES";
  3.  
  4.     foreach($b as $c => $d){
  5.         $query.= " ($d),";
  6.     }
  7.     $query = substr($query,0,-1);
  8.     mysql_query($query);
  9.     // TODO verificar si hubo problemas etc, etc
  10. }

Acoplado del ejemplo: http://www.forosdelweb.com/f18/probl...masivo-966025/

Última edición por mager3; 11/12/2018 a las 05:31 Razón: modificar la nota.
  #4 (permalink)  
Antiguo 11/12/2018, 06:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Insert de miles de registros muy lento

PHP es OFF TOPIC en los foros de BBDD.

Movido al foro adecuado.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 11/12/2018, 10:41
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: Insert de miles de registros muy lento

la mejor solucion es que lo hagas por TROZOS de 100 registros en 100, y como te dijeron mas arriba que armes una CONSULTA MYSQL que realize la insercion de 100 registros con una unica llamada a la funcion mysqli_query, ya que cada vez que llamas a esta funcion, hace varios procesos,
*verificacion de conexion
*validacion de los AUTH
*apertura de punteros
*open y close connections
y algunas que otras

como te comentaron la mejor solucion mas rapida, es que realizes, por trozos grandes las inserciones, y que trates de usar las funciones mysqli_query lo menos posible. y otra cosa es que esto deberia ser ejecutado por un proceso aparte, un unico demonio que este realizando esta operacion
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #6 (permalink)  
Antiguo 11/12/2018, 13:11
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Mensaje Respuesta: Insert de miles de registros muy lento

intente ejecutar la consulta por bloques preguntando si el contador es múltiplo (para el caso: multiplo de 3) y me funciona parcialmente porque si tengo 10 registros me genera un insert cada 3 registros pero el 10 no me lo ejecuta... "Claro porque no es múltiplo de 3 no entraen la condición". me pueden por favor orientar.


Código PHP:
Ver original
  1. While ($row = OCI_Fetch_Array($rstOpenConvenio)) {
  2.  
  3.     //$resultado = mysqli_query($qMysql, $conn);
  4.     //mysqli_query($conn,"INSERT INTO mesanterior (ss) VALUES ('".$row[0]."')");
  5.  
  6.     $contador=$contador+1;
  7.     $values.= "('".$row[0]."','".$row[1]."','".$row[2]."','".$row[3]."','".$row[4]."','".$row[5]."','".$row[6]."','".$row[7]."','".$row[8]."','".$row[9]."','".$row[10]."','".$row[11]."','".$row[12]."','".$row[13]."','".$row[14]."','".$row[15]."','".$row[16]."'),";
  8.  
  9.     if (fmod($contador, 100)==0){
  10.         $qMysql = "INSERT INTO mesanterior (periodicidad,SS,cargdoso,cargunid,cargconc,concdesc,cargvalor,cargsign,sesuserv,sesususc,sesucate,sesusuca,pefacicl,locadesc,tipodir,copagina,observacion) VALUES";
  11.         $values = substr($values,0,-1);
  12.         $sql=$qMysql." ".$values;
  13.         echo $sql;
  14.         $resultado=mysqli_query($conn,$sql);
  15.         $values="";
  16.         echo $contador." es multipo de 100 ";
  17.         echo "<br><br>";
  18.     }
  19. }

Última edición por mager3; 11/12/2018 a las 13:23
  #7 (permalink)  
Antiguo 11/12/2018, 19:30
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: Insert de miles de registros muy lento

Código PHP:
Ver original
  1. <?php
  2. $values=array();
  3. $contador=0;
  4. While ($row = OCI_Fetch_Array($rstOpenConvenio)) {
  5.  
  6.     //$resultado = mysqli_query($qMysql, $conn);
  7.     //mysqli_query($conn,"INSERT INTO mesanterior (ss) VALUES ('".$row[0]."')");
  8.     $values[]= "('".$row[0]."','".$row[1]."','".$row[2]."','".$row[3]."','".$row[4]."','".$row[5]."','".$row[6]."','".$row[7]."','".$row[8]."','".$row[9]."','".$row[10]."','".$row[11]."','".$row[12]."','".$row[13]."','".$row[14]."','".$row[15]."','".$row[16]."')";
  9.     if(count($values)>99){// es mayor a 99 hacemos el insert
  10.         $qMysql = "INSERT INTO mesanterior (periodicidad,SS,cargdoso,cargunid,cargconc,concdesc,cargvalor,cargsign,sesuserv,sesususc,sesucate,sesusuca,pefacicl,locadesc,tipodir,copagina,observacion) VALUES ";
  11.         $qMysql .= implode(",\n",$values);
  12.         echo $sql;
  13.         $resultado=mysqli_query($conn,$sql);
  14.         echo count($values)." es multipo de 100 ";
  15.         echo "<br><br>";
  16.         //vaciamos la variable $values
  17.         $values=array();
  18.     }
  19. }
  20. // en caso de que siga existiendo los datos, pero estos no llegaron al limite, realizamos nuevamente la insercion
  21. if(count($values)>0){
  22. $qMysql = "INSERT INTO mesanterior (periodicidad,SS,cargdoso,cargunid,cargconc,concdesc,cargvalor,cargsign,sesuserv,sesususc,sesucate,sesusuca,pefacicl,locadesc,tipodir,copagina,observacion) VALUES ";
  23.         $qMysql .= implode(",\n",$values);
  24.         echo $sql;
  25.         $resultado=mysqli_query($conn,$sql);
  26.  
  27.         echo count($values)." es multipo de 100 ";
  28.         echo "<br><br>";
  29.  
  30. }
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9

Última edición por tuadmin; 11/12/2018 a las 19:32 Razón: falto un IF
  #8 (permalink)  
Antiguo 13/12/2018, 06:51
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Respuesta: Insert de miles de registros muy lento

Muchas gracias a todos, me funcionó perfecto.

Etiquetas: mysql, mysqli
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:50.