¿Cuál es más rápido, la inserción masiva del servidor SQL o bcp?
Hoy creé una herramienta de importación por lotes de archivos de texto basada en SQL Server y me gustaría compartir mi experiencia con ustedes.
Opción 1:
Recorre el archivo de texto, analiza cada línea, forma una declaración SQL e insértala en la base de datos.
Opción 2
Recorra el archivo de texto, analice cada línea, guarde la instrucción SQL en el archivo de texto y luego ejecútela.
Opción 3
Utilice la función de inserción masiva de SQL Server para exponer los datos importados y luego realizar el procesamiento de datos en la base de datos.
Cuando comencé a usar el Plan 1, me tomó entre 20 y 25 minutos importar un archivo de texto de 50 MB. Posteriormente, se optimizó y se utilizó la inserción de datos por lotes, lo que resultó en una pequeña mejora en el rendimiento.
Continúe optimizando y utilizando subprocesos múltiples para insertar datos en la base de datos. El rendimiento aumentará entre 10 y 20, pero el efecto no es bueno.
La opción 2 no se ha probado completamente, principalmente porque tarda unos 15 minutos en generar el archivo SQL, lo cual no es lo ideal.
Finalmente use BULK INSERT y luego escriba un script en la base de datos para procesar los datos. Se puede importar un archivo de 50 MB en 10 segundos
FQuery.SQL.Text:= 'BULK. INSERT LOGDATA FROM ' QuotedStr(FFileName)
' CON (FIELDTERMINATOR = '', '', ROWTERMINATOR = ''\n'', BATCHSIZE = 500)'
FQuery. ExecSQL;
p>Finalmente ejecute una gran cantidad de declaraciones UPDATE para formatear los datos
Se recomienda utilizar BULK INSERT cuando se importan grandes cantidades de datos de SQL SERVER. un SQL 4 ms, 1000 La ejecución tarda 4 segundos, lo cual no es nada más rápido.
La velocidad de prueba de inserción de Java es la misma que la de inserción masiva después de 9i.
El Los resultados de las pruebas muestran que la velocidad de inserción masiva es bastante rápida.
p>
100000 registros
inserción, -------------- -93 segundos
inserción masiva ------- ------0,441 segundos
Entorno:
oracle 10.2.0.3 Windows 2000Server
java
Código:
SQLgt; desc a
Nombre Tipo Anulable Comentarios predeterminados
---- ------------ ------- - ------- --------
ID INTEGER Y
NOMBRE VARCHAR2(20) Y
insertar masivamente tipos y procedimientos usados
crear o reemplazar el tipo i_table es la tabla del número(10);
crear o reemplazar el tipo v_table es la tabla de varchar2(10);
crear o reemplazar el procedimiento pro_forall_insert(v_1 i_table, v_2 v_table)
como
c entero; p>
comenzar
para todo i en 1. . v_1.count
insertar en valores(v_1(i), v_2(i)); p>end;
Código java probado:
p>clase pública testOracle {
testOracle público() {
Conexión oraCon = nulo;
Declaración preparada ps = nulo;
Declaración st = nulo;
ResultSet rs = nulo;
prueba {
pruebe {
Class.forName("oracle .jdbc.driver.OracleDriver");
} catch (ClassNotFoundException ex) {}
oraCon = DriverManager.getConnection("jdbc:oracle:thin:@192.168.15.234:1521:ora10g", "imcs", "imcs");
oraCon.setAutoCommit(false);
} catch (SQLException ex) {
ex.printStackTrace();
}
CallableStatement cstmt = null;
oracle.sql.ArrayDescriptor a = null;
oracle.sql.ArrayDescriptor b = null;
if (1 == 1 )
{
Objeto[] s1 = nuevo Objeto[100000];
Objeto[] s2 = nuevo Objeto[100000]; p>
p>
for (int i = 0; i lt; 100000; i) {
s1[i] = nuevo entero(1);
s2[i] = new String("aaa").concat(String.valueOf(i));
}
prueba {
a = oracle .sql.ArrayDescriptor.createDescriptor("I_TABLE", oraCon);
b = oracle.sql.ArrayDescriptor.createDescriptor("V_TABLE", oraCon);
ARRAY a_test = nuevo ARRAY (a, oraCon, s1);
ARRAY b_test = new ARRAY(b, oraCon, s2);
cstmt = oraCon.prepareCall("{ llamar a pro_forall_insert(?,?) }");
cstmt.setObject(1, a_test);
cstmt.setObject(2, b_test);
long aaaa = System.currentTimeMillis( );
System.out.println(System.currentTimeMillis());
cstmt.execute();
oraCon.commit(); p>
System.out.println(System.currentTimeMillis()-aaaa);
} catch (Excepción e) {
e.printStackTrace();
}
}
si no
{
inténtalo
{
PreparedStatement oraPs = null;
Cadena oraInsertSql =
"insertar en valores(?,?)";
oraPs = oraCon.prepareStatement(oraInsertSql);
long aaaa = System.currentTimeMillis();
System.out.println(System.currentTimeMillis());
for (int i = 0; i lt; 100000; i)
{
oraPs.setInt(1, i);
oraPs.setString(2, new String("aaa").concat(String.valueOf(i)));
oraPs. ejecutarUpdate();
}
oraCon.commit();
System.out.println(System.currentTimeMillis()-aaaa); >
}
catch (SQLException ex)
{
System.out.print("dddddd");
System.out.print(ex.getMessage());
}
}
prueba {
jbInit();
} catch (Excepción ex) {
ex.printStackTrace();
}
}
público static void main(String args[]) {
testOracle a = new testOracle();
}
private void jbInit() lanza una excepción { p>
p>
}
};