Carga lenta Desde AS400

Carga lenta Desde AS400 jatb 9 Marzo, 2013 - 00:55
Hola a todos, Estoy haciendo en SSIS 2008 la carga de información de tablas de as400, las tablas pequeñas no tengo problemas me trae bien, pero al traer una tabla de 711534 registros la misma que tiene 253 columnas el tiempo de carga es de alrededor de 40 min lo cual es algo que no sirve, anteriormente lo teniamos en DTS 2000 y el tiempo de carga no es mayor a 2 min. Intentado algunas cosas pero ninguna me da resultado, no se que me recomiendan hacer para poder hacer esto con igual o menor tiempo que la version 2000. Espero sus respuestas. De antemano gracias.

Hola Jonathan

Supongo que ya habréis hecho pruebas, pero me parece una diferencia demasiado grande para venga sólo por el cambio de versión de DTS a SSIS. Yo antes que nada me aseguraría de que no hay algún factor más que os ralentiza esta carga, como saturación de las bases de datos, espacio, bloqueos..

De la parte de SSIS tampoco tengo gran experiencia, pero yo revisaría sobretodo los parámetros de carga, asegurándome de que estuvieran orientados a cargas masivas, sin validaciones ni transformaciones, y utilizando el máximo de memoria posible. Según cómo lo hagas suele ser la opción 'Fast Load', y revisar las opciones 'FastLoadOptions'. 

Te enlazo el post Using SQL Server Integration Services to Bulk Load Data, que comenta bastante detalladamente tres métodos de carga que podrías probar. Si has utilizado OLE DB, por ejemplo, si la revisión de parámetros no te funciona, puedes probar con el componente SQL Server Destination, que según el artículo permite definir propiedades como BATCHSIZE=0 para realizar toda la carga en un solo batch.

You might have noticed that the Advanced screen does not include any options related to batch sizes. SSIS handles batch sizes differently from other batch-loading options. By default, SSIS creates one batch per pipeline buffer and commits that batch when it flushes the buffer. You can override this behavior by modifying the Maximum Insert Commit Size property in the SQL Server Destination advanced editor. You access the editor by right-clicking the component and then clicking Show Advanced Editor. On the Component Properties tab, modify the property with the desired setting:

  • A setting of 0 means the entire batch is committed in one large batch. This is the same as the BULK INSERT option of BATCHSIZE = 0.
  • A setting less than the buffer size but greater than 0 means that the rows are committed whenever the number is reached and also at the end of each buffer.
  • A setting greater than the buffer size is ignored. (The only way to work with batch sizes larger than the current buffer size is to modify the buffer size itself, which is done in the data flow properties.)

Espero que te sea de ayuda,

 

 


Gracias Carlos,

Lei el articulo que me has dicho, pero esto es mas orientado a archivos planos o conexiones entre bases sql, pero de as400 a sql server no sirve.

Te cuento un poco mas para hacer la conexion utilizo el proivder: IBM DB2 UDB for iSeries IBMDA400 OLE DB Provider, al hacer test me da ok, dentro del OLE DB Source utilizo esta conexion compartida y ingreso SQL command y pongo en preview y me muestra la data, esto le uno al OLE DB Destination utilizando la propieda fast load, mapeo los datos y previwe y todo ok.

Cuando mando ejecutar el contenderon me trae un promedio de 20000 por minuto que es un tiempo alto ya que en el DTS 2000 en 2 minutos ya trae los 7mil registros.

Para la tranfornmacion de datos e utilizado Multicast, Derived Column, entre otros pero la respuesta es igual de lenta.

Los epsacios en discos y lo relacionado con la bdd esta muy bien.

Espero alguien me ayude.

Saludos

En respuesta a por jatb

Bueno, te sirve toda la parte de configuración de los componentes destino, OLE DB o SQL Server Destination. Si no has encontrado nada que ya no hayas probado ya es otra cosa.

Otra cosa que puedes hacer es separar la importación de datos de las transformaciones, es decir, hacer una carga directa desde OLE DB Source a OLE DB Destination, que puedes dejar en una tabla temporal de SQL Server. Después haces todas las transformaciones desde la tabla temporal hacia la definitiva, así separas entornos y seguro que lo tienes más fácil para localizar el 'cuello de botella'.

 

 La manera que solucione no se si es la adecuada es con el uso de tablas vinculadas con access, con esto la respuesta fue la misma que trabajar con DTS del 2000.

 

Es sorprendente que una version 8 años mas a ctual sea 100% mas lenta la carga desde as400.

 

Saludos

En respuesta a por jatb

 A mi me ha pasado varias veces que he intentado hacer algo utilizando los componentes de SSIS para que sea más fácil de mantener, y al final, por la manera en que Integration Services trata el flujo de datos, prácticamente registro a registro, para que la carga no se haga eterna he terminado por eliminar los componentes y hacer la mayor parte del 'trabajo' con llamadas a sentencias SQL.

De todas maneras para una simple importación de datos no tendrían que pasar estas cosas, es muy fuerte que te funcione mejor con tablas vinculadas con access, y espero que al menos el problema sea sólo al importar desde AS400, algún bug en el driver o algo así..

Muchas gracias por compartir la solución, y me alegro de que al menos hayas podido solventar el problema de lentitud, aunque haya sido 'tirando de Access' :)