2011-08-17 33 views
5

En los últimos días he estado jugando con el SQL * Loader de Oracle en un intento de cargar datos a granel en Oracle. Después de probar diferentes combinaciones de opciones, me sorprendí al descubrir que la carga de ruta convencional se ejecuta mucho más rápido que la carga de ruta directa.Oracle SQL * cargador que se ejecuta en modo directo es mucho más lento que la carga de ruta convencional

Algunos datos sobre el problema:

  • Número de registros de carga es de 60K.
  • El número de registros en la tabla de objetivos, antes de la carga, es de 700 millones.
  • La versión de Oracle es 11g r2.
  • El archivo de datos contiene la fecha, el carácter (ascii, no se requiere conversión), entero, flotante. Sin blob/clob.
  • La tabla está dividida por hash. La función hash es igual que PK.
  • Paralelo de la tabla se establece en 4 mientras que el servidor tiene 16 CPU.
  • El índice está particionado localmente. Paralelo de índice (desde ALL_INDEXES) es 1.
  • Solo hay 1 PK y 1 índice en la tabla de destino. Restricción PK construida usando índice.
  • La comprobación de las particiones de índice reveló que la distribución de registros entre las particiones es bastante parejo.
  • El archivo de datos está delimitado.
  • Se utiliza la opción APPEND.
  • Seleccionar y eliminar los datos cargados a través de SQL es una respuesta bastante rápida y casi instantánea.

Con trayectoria convencional, la carga se completa en aproximadamente 6 segundos.

Con carga de ruta directa, la carga tarda unos 20 minutos. La peor ejecución lleva 1,5 horas hasta completa pero el servidor no estaba ocupado.

Si skip_index_maintenance está habilitado, la carga de la ruta directa se completa en 2-3 segundos.

He intentado un buen número de opciones, pero ninguna de ellas mejora notablemente ... INACTIVA, INDICES CLASIFICADOS, MULTIMEDIA (estoy ejecutando SQL * Loader en un servidor de CPU múltiple). Ninguno de ellos mejora la situación.

Aquí es el evento espera seguía viendo durante el SQL tiempo * cargador funciona en modo directo:

  • Evento: archivo db lectura secuencial
  • P1/2/3: archivo #, bloque #, bloques (cheque de dba_extents que se trata de un bloque de índice) de clase
  • Espera: usuario I/O

¿alguien tiene alguna idea de lo que ha ido mal con la carga camino directo? ¿O hay algo que pueda verificar más para realmente cavar la raíz del problema? Gracias por adelantado.

Respuesta

3

supongo que está cayendo aves de esta

"Al cargar un número relativamente pequeño de filas en una gran tabla indexada

Durante una carga vía directa, el índice existente se copia cuando se fusionó con las nuevas claves de índice. Si el índice existente es muy grande y el número de claves nuevas es muy pequeño, entonces el tiempo de copia de índice puede compensar el tiempo ahorrado por una carga de ruta directa ".

partir Cuándo utilizar un camino convencional de carga en: http://download.oracle.com/docs/cd/B14117_01/server.101/b10825/ldr_modes.htm

+0

¿Sabe usted que el comportamiento no sólo se producen para SQL Loader o se comporta de la misma manera con la inserción agregue? Hice una prueba muy rápida y no pareció copiar mi índice existente (alrededor de 92 Meg) cuando inserté 100 filas con la sugerencia de agregar. –

+0

No tengo ni idea, supongo que si trataras de insertar filas de apéndice 60k, mostraría el mismo comportamiento –

+0

Gracias Kevin. Me perdí totalmente esa sección cuando escaneo a través del documento de SQL * Loader. Pero, ¿cuál podría ser la mejor manera de cargar una gran cantidad de datos en una tabla no vacía con una cantidad relativamente grande de registros? – Stanley

Cuestiones relacionadas