2008-09-27 58 views
7

Estoy escribiendo una conversión de datos en PL/SQL que procesa datos y los carga en una tabla. De acuerdo con PL/SQL Profiler, una de las partes más lentas de la conversión es la inserción real en la tabla de destino. La tabla tiene un solo índice.¿Cuál es la forma más rápida de insertar datos en una tabla de Oracle?

para preparar los datos para la carga, que pueblan una variable mediante el tipo de fila de la tabla, a continuación, insertarlo en la tabla como la siguiente:

insert into mytable values r_myRow;

Parece que podría ganar el rendimiento de la siguiente manera:

  • desactivar el registro durante la inserción
  • Insertar varios registros a la vez

¿Estos métodos son aconsejables? Si es así, ¿cuál es la sintaxis?

Respuesta

14

¡Es es mucho mejor insertar unos cientos de filas a la vez, usando tablas PL/SQL y FORALL para enlazar a la declaración de inserción. Para más detalles sobre esto, vea here.

También tenga cuidado con la forma en que construye las tablas PL/SQL. Si es posible, prefiera hacer todas sus transformaciones directamente en SQL usando "INSERT INTO t1 SELECT ..." ya que las operaciones fila por fila en PL/SQL seguirán siendo más lentas que SQL.

En cualquier caso, también puede usar insertos de ruta directa usando INSERT /*+APPEND*/, que básicamente pasa por alto el caché de DB y asigna y escribe directamente nuevos bloques en los archivos de datos. Esto también puede reducir la cantidad de registros, dependiendo de cómo lo use. Esto también tiene algunas implicaciones, así que lea primero el fine manual.

Finalmente, si está truncando y reconstruyendo la tabla, puede valer la pena colocar primero (o marcar inutilizable) y luego volver a generar índices.

0

Coloque el índice, inserte las filas y vuelva a crear el índice.

+0

El uso de un insetr mayor Sin embargo, la metodología mitigará el efecto de tener el índice allí. –

0

Comprobar este enlace http://www.dba-oracle.com/t_optimize_insert_sql_performance.htm

  1. puntos principales a tener en cuenta para su caso es utilizar Anexar pista sobre este añadirá directamente en la tabla en lugar de utilizar freelist. Si puede permitirse desactivar el inicio de sesión, utilice Agregar una sugerencia de nologging para hacerlo
  2. Use una inserción masiva en lugar de iterar en PL/SQL
  3. Use sqlloaded para cargar los datos directamente en la tabla si obtiene datos desde un archivo de entrada
2

Las declaraciones de inserción regulares son la forma más lenta de obtener datos en una tabla y no están destinados a inserciones masivas. El siguiente artículo hace referencia a una gran cantidad de diferentes técnicas para mejorar el rendimiento: http://www.dba-oracle.com/oracle_tips_data_load.htm

+0

Ese enlace está lleno de consejos horribles. –

0

Quizás una de las mejores opciones es evitar Oracle tanto como sea posible. Me he sentido desconcertado por esto, pero muy a menudo un proceso de Java puede superar muchas de las utilidades de Oracle que usan OCI (leer: SQL Plus) o tomarán mucho tiempo para hacerlo bien (léase: SQL * Cargador).

Esto no le impide utilizar consejos específicos (como/APPEND /).

Me he quedado gratamente sorprendido cada vez que recurro a ese tipo de solución.

Saludos,

Rollo

1

Supongamos que usted ha tomado Eid, ename, sal, trabajo. Por lo tanto crear una tabla por primera vez como:

SQL>create table tablename(eid number, ename varchar2(20),sal number,job char(10)); 

Ahora insertar datos: -

SQL>insert into tablename values(&eid,'&ename',&sal,'&job'); 
0

Estas son mis recomendaciones sobre la inserción rápida.

Disparador: deshabilita cualquier activador asociado a una tabla. Habilízate después de completar las inserciones.

Índice: suelte el índice y vuelva a crearlo después de que se hayan completado sus inserciones.

Estadísticas obsoletas: vuelve a analizar la tabla y las estadísticas de índice.

De-fragmentación de índice - Reconstruir índice si es necesario No usar registro -Insertar usando INSERTAR APPEND (solo Oracle). Este enfoque es muy arriesgado, no se generan registros de rehacer, por lo tanto no se puede hacer una reversión: hacer una copia de seguridad de la tabla antes de comenzar y no probar en las tablas activas. Compruebe si su base de datos tiene una opción similar

Inserción paralela: la inserción paralela en ejecución hará que el trabajo sea más rápido.

Uso inserción masiva Restricciones - No hay mucho por encima durante inserciones pero sigue siendo una buena idea para comprobar, si todavía es lento después incluso después del paso 1

se puede aprender más sobre http://www.dbarepublic.com/2014/04/slow-insert.html

Cuestiones relacionadas