[Ayuda] Una manera rapida de insertar registros a una base de datos en SQL

Iniciado por Mine Sweeper, 26 Julio 2013, 17:13 PM

0 Miembros y 1 Visitante están viendo este tema.

Mine Sweeper

Buenos Dias, tengo un codigo que lo que hace es traer informacion de un AS 400 e insertarla en un servidor SQL

El problema es que son alrededor de 4 millones de registros entonces al hacer el insert a sql tarda alrededor de 9 horas, lo que hago es insertarlos de 100mil en 100mil

Existe una manera de hacerlo mas rapido?

Este es mi codigo:
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import java.io.IOException;

public class Main {
public static void main(String[] args) {
ForsConn forsConn;
SqlConn sqlConn;



try {
forsConn= new ForsConn();
sqlConn = new SqlConn();
} catch (Exception e1) {
e1.printStackTrace();
}

ResultSet rsDownload;
ResultSet rsInsert;
ResultSet rsDelete;
String sqlInsert="";
String LAKT="";
String delete = "";
String[][] Arreglo = new String[100000][15];

delete= "DELETE FROM Tbl_FORSD_LAKTX0";

LAKT = "SELECT DOS_LAKT_FIRMNR, DOS_LAKT_WERKNR, DOS_LAKT_BCHGNR, " +
"DOS_LAKT_BCHGPO, DOS_LAKT_BUARTT, DOS_LAKT_TEILNR, DOS_LAKT_MNGABG, " +
"DOS_LAKT_MNGANN, DOS_LAKT_AUFTNR, DOS_LAKT_AUFTPO, OBTENR, " +
"DOS_LAKT_ZGGUNV, DOS_LAKT_BSTART, DOS_LAKT_BLGNRR, DOS_LAKT_BCHDAT " +
"FROM FORSDR45.LAKTX0 " +
"WHERE (((DOS_LAKT_FIRMNR)=4) AND ((DOS_LAKT_BUARTT)='01' Or (DOS_LAKT_BUARTT)='12') " +
"AND ((DOS_LAKT_ZGGUNV)>=('2013')))";

try {
rsDelete=SqlConn.getDataSql3(delete);
System.out.println ("Registros Borrados");
} catch (SQLException e1) {
e1.printStackTrace();
}

try
{

rsDownload=ForsConn.getDataFors(LAKT);
int x;
rsDownload.next();
while(rsDownload.getString(1)!=null)
{
z:
for(x=0; x<99999; x++)
{
System.out.println (x);
if(rsDownload.next()){
       
          Arreglo[x][0]= rsDownload.getString("DOS_LAKT_FIRMNR");
          Arreglo[x][1]= rsDownload.getString("DOS_LAKT_WERKNR");
  Arreglo[x][2] = rsDownload.getString("DOS_LAKT_BCHGNR");
          Arreglo[x][3] = rsDownload.getString("DOS_LAKT_BCHGPO");
  Arreglo[x][4] = rsDownload.getString("DOS_LAKT_BUARTT");
          Arreglo[x][5] = rsDownload.getString("DOS_LAKT_TEILNR");
  Arreglo[x][6] = rsDownload.getString("DOS_LAKT_MNGABG"); 
          Arreglo[x][7] = rsDownload.getString("DOS_LAKT_MNGANN");
  Arreglo[x][8] = rsDownload.getString("DOS_LAKT_AUFTNR"); 
          Arreglo[x][9] = rsDownload.getString("DOS_LAKT_AUFTPO");
  Arreglo[x][10] = rsDownload.getString("OBTENR");
          Arreglo[x][11] = rsDownload.getString("DOS_LAKT_ZGGUNV");
  Arreglo[x][12] = rsDownload.getString("DOS_LAKT_BSTART");
          Arreglo[x][13] = rsDownload.getString("DOS_LAKT_BLGNRR");
          Arreglo[x][14] = rsDownload.getString("DOS_LAKT_BCHDAT");
         
          /*System.out.println (Arreglo[x][0]);
          System.out.println (Arreglo[x][1]);
          System.out.println (Arreglo[x][2]);
          System.out.println (Arreglo[x][3]);
          System.out.println (Arreglo[x][4]);
          System.out.println (Arreglo[x][5]);
          System.out.println (Arreglo[x][6]);
          System.out.println (Arreglo[x][7]);
          System.out.println (Arreglo[x][8]);
          System.out.println (Arreglo[x][9]);
          System.out.println (Arreglo[x][10]);
          System.out.println (Arreglo[x][11]);
          System.out.println (Arreglo[x][12]);
          System.out.println (Arreglo[x][13]);
          System.out.println (Arreglo[x][14]);*/
         
  }
else
break z;



}

for(x=0; x<99999; x++)
{
try {

sqlInsert = "INSERT INTO Tbl_FORSD_LAKTX0 (DOS_LAKT_FIRMNR, DOS_LAKT_WERKNR, DOS_LAKT_BCHGNR, " +
"DOS_LAKT_BCHGPO, DOS_LAKT_BUARTT, DOS_LAKT_TEILNR, DOS_LAKT_MNGABG, " +
"DOS_LAKT_MNGANN, DOS_LAKT_AUFTNR, " + "DOS_LAKT_AUFTPO, OBTENR, " +
"DOS_LAKT_ZGGUNV, DOS_LAKT_BSTART, DOS_LAKT_BLGNRR, DOS_LAKT_BCHDAT) " +
"VALUES ( '" + Arreglo[x][0] + "' , '" + Arreglo[x][1] + "' , '" + Arreglo[x][2] +
"' , '" + Arreglo[x][3] + "' , '" + Arreglo[x][4] + "','" + Arreglo[x][5] +
"','" + Arreglo[x][6] + "','" + Arreglo[x][7] + "','" + Arreglo[x][8]  +
"','" + Arreglo[x][9] +  "','" + Arreglo[x][10] + "','" + Arreglo[x][11] +
    "','" + Arreglo[x][12] + "','" + Arreglo[x][13] + "','" + Arreglo[x][14] + "')";


rsInsert=SqlConn.getDataSql3(sqlInsert);
System.out.println ("Registro Agregado");
//sql="select DOS_LAKT_BCHGNR from Tbl_FORSD_LAKTX0 where DOS_LAKT_BCHGNR=" + Arreglo[x][3].trim();

}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
catch(Exception e) {
e.printStackTrace();
}



}
     
    }




1mpuls0

Se podría hacer pruebas con dos formas.

Java: Programación concurrente
SQL: Mejorar las consultas.

A pesar de que no distingo muy bien el código (si puedes colocar el geshi en java) parece ser que las consultas no soy muy complejas y no hay mucho que mejorar  :xD

Ahora que sigo revisando veo que tienes un arreglo, por qué en lugar de almacenarlo no lo insertas directamente?.

La verdad es que nunca lo he hecho así y desconozco si haya una diferencia de tiempo considerable.
Tal vez habría que hacer un método para calcular el tiempo entre usar arreglo e insertarlo directamente una vez obtenido los valores, es decir utilizar 15 variables.

Saludos.
abc

Mine Sweeper

#2
Si son consultas sencillas, es solo un select y un insert, estaba haciendo pruebas por eso esta mediante un arreglo, lo hice directamente y tardo aproximadamente lo mismo, cuando hice pruebas con el arreglo tardo aproximadamente dos horas, pero la prueba con el arreglo no la hice utilizando todas las columnas, por eso pienso que tardo menos, entonces ahora que lo hago con todos los campos quiero pensar que por eso tarda mas.

~ Yoya ~

Como ha dicho Darhius, utiliza Thread. Pero tienes que tener cuidado, no vayas a crear 1,000 thread y satures el servidor donde insertas la informacion.

Tambien puedes aplicar Thread para extraer la informacion.

Saludos.
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.