2012-01-01 48 views
5

Tengo 471 archivos que suman unos 100 GB. Los archivos son "\ t" por separado, con los datos de transacción en el siguiente formato:Oracle 11gR2 cargando varios archivos: sqlldr o tablas externas?

char(10) not null, 
char(8) not null, 
char(1) not null, 
char(4) not null, 
number not null, 
char(1) not null, 
char(1) not null, 
char(1) not null, 
number not null 

El orden de las transacciones en los archivos es importante y debe ser preservada, a ser posible con un identificador de clave primaria. Inicialmente, cargué estos archivos con sqlldr pero lleva mucho tiempo. Recientemente aprendí sobre tablas externas. Desde una perspectiva estratégica, ¿qué método es mejor? ¿Cómo funciona la tabla externa? Gracias.

+1

* ¿Cómo funciona la tabla externa * Eso es totalmente documentado en el manual: http://docs.oracle.com/cd/E11882_01/server.112/e22490/et_concepts.htm –

+0

¿por qué sqlldr tomaría mucho tiempo? Pruebe la carga directa y asegúrese de que sus datos estén en la misma subred o SAN (o, básicamente, no empujen los datos a través de un conducto pequeño a través de la red, como un servidor en NJ que presiona a un DB en CA). Algunas restricciones para la carga directa, pero MUCHO más rápido. – tbone

+1

Caluché que sqlldr se está cargando a una velocidad de 85 millones de filas por hora. Basado en hablar con un hombre, esto parece razonable, pero él no es un experto. Hay un compromiso cada 300k filas. Una secuencia de oráculo genera una clave principal en el inserto. El orden de los datos es importante y la clave conserva el orden. Los archivos están en una unidad en el mismo servidor que la base de datos. ¿Se puede lograr un mejor índice? –

Respuesta

3

El análisis sintáctico de Tablas externas y SQL * Loader es muy similar, por lo que normalmente no hay una gran diferencia de rendimiento en el mismo formato de registro. Sin embargo, tablas externas pueden ser más apropiados en las siguientes situaciones:

  • desea transformar los datos a medida que se carga en la base de datos.
  • Desea cargar datos y se requiere una indexación adicional de la tabla de etapas.
  • Desea utilizar el procesamiento paralelo transparente sin tener que dividir primero los datos externos.

Sin embargo, en las siguientes situaciones, utilizar SQL * Cargador para el mejor rendimiento de carga:

  • desea cargar datos de forma remota.
  • No se requieren transformaciones en los datos, y los datos no necesitan cargarse en paralelo.

Para mejorar el rendimiento de SQL * Loader, se han realizado las siguientes sugerencias.

  • no tienen ningún índices y/o limitaciones (claves primarias) en su carga mesas durante el proceso de carga
  • Añadir la siguiente opción en la línea de comandos: DIRECTO = TRUE. Esto hará que omita la mayor parte del procesamiento de RDBMS utilizando el cargador de ruta directa en lugar del cargador de ruta convencional. Sin embargo, hay algunos casos cuando no puede usar la carga directa. Estas restricciones pueden obtenerse de la Guía de utilidades del servidor Oracle
  • Utilice datos de ancho fijo en lugar de datos delimitados. Para los datos delimitados, cada registro necesita ser analizados en busca de la función Try delimitador
  • para evitar las conversiones de juegos de caracteres como conversiones son el tiempo y la CPU intensiva
  • para el camino convencional, utilice los parámetros READSIZE y BINDSIZE.
    READSIZE captará trozos más grandes de datos por llamada al sistema de lectura. El parámetro BINDSIZE especifica el tamaño de la matriz se unen, que a su vez especifica el número de filas que será cargado por lote

Fuente:? http://download.oracle.com/otndocs/products/database/enterprise_edition/utilities/pdf/sql_loader_faq.pdf

+0

paralelo funciona en ambos casos. –

+0

Esto hubiera sido +1 pero para "usar datos de ancho de corrección". ¿Nadie le pregunta a su cliente por seguro? – Ben

+0

@FlorinGhita Tiene razón, no estoy seguro de por qué Oracle lo incluiría en su documentación ... –

Cuestiones relacionadas