none
Tiempos de ejecucion de paquete SSIS en el servidor RRS feed

  • Pregunta

  • Hola. Tengo un problema con un paquete SSIS. Una vez que estaba preparado el paquete en local, lo subi al servidor e hice las pruebas pertinentes con el Development Studio y la ejecución completa me tardó lo correcto, media hora. El problema vino cuando publique el paquete en el servidor de Integration Services (Stored Packaged) y volví a ejecutarlo desde allí. Entonces me tarda muchisimo mas (muchas horas ......), creo que es en un Loop Foreach con sentencian Select y Update en su interior ..... ¿Por que puede ser esto?, ¿Como puedo solucionarlo sin tener que ir a ejecutarlo al Development Studio?
    jueves, 17 de noviembre de 2011 9:37

Respuestas

  • Entiendo. Entonces nada, a capturar trazas, como te sugiere Alberto... En los libros en línea de SQL Server, consulta esta sección Introducción a SQL Server Profiler y ahí te explica como capturarla e incluso analizarla. Necesitarás dos, una para el BIDS y otra para el SSMS... Cuando las tengas y analices, si quieres una segunda opinión, las compartes mediante otro post, tal vez tengas que compartir el archivo porque puede ser grande, y ahí con gusto te colaboramos.

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    jueves, 17 de noviembre de 2011 12:54

Todas las respuestas

  • Hola.

    Pueden ser muchas cosas. ¿Lo ejecutas contra el mismo entorno? Pueden ser bloqueos, por ejemplo. Deberás poner algún tipo de traza que te dé alguna pista más, de cara a solventarlo.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/ Sígueme en twitter en http://twitter.com/qwalgrande

    jueves, 17 de noviembre de 2011 10:08
    Moderador
  • Soy un poco nuevo en esto pero, creoq que si, supongo que es el mismo entorno. Ambas formas de ejecuión las hago directamente en el propio servidor, es decir, abro el Development y lo ejecuto, cuando termina voy a Management lo lo ejecuto ... la diferencia es bestial.

    Por otra parte, ¿como puedo poner una traza?, como te he dicho, soy novato en este entorno.

    jueves, 17 de noviembre de 2011 10:14
  • Como te comenta Alberto, pueden ser muchas cosas, pero la ejecución de un paquete en BIDS es siempre más lenta que ejecutarla en el servidor. Siempre y cuando se esté comparando lo mismo: es decir, que puede que en tu entorno de desarrollo los datos con los que trabajes sean 10 y cuando se ejecute en el servidor sean 1000000.

    ¿Has diseñado tú el paquete? ¿Cómo lo ejecutas en el servidor (mediante un job o directamente el paquete conectándote al servidor de Integration Services)? ¿Puedes ponernos aquí lo que hace dicho paquete?

    Y, por cierto, este tipo de preguntas encajan mejor en el foro de SSIS: http://social.msdn.microsoft.com/Forums/es-ES/ssises/threads

    jueves, 17 de noviembre de 2011 10:31
  • Si, si, el origen de datos (un fichero "txt") está en el servidor y ambas ejecuciones las hago desde el propio servidor y cogen este mismo fichero.

    Curiosamente la ejecucion desde BIDS es la que funciona rapidamente mientras que la ejecucion que lanzo desde Managemente (conectándote al servidor de Integration Services, Stodes Packaged) es la que tarda muchisimo.

    Basicamente lo que hace son los siguientes pasos:

    1.- Borrar el contenido de todas las tablas de la base de datos

    2.- Cargar el contenido de todas las tablas de la base de datos

    3.- Llamar a otro paquete1 que se encarga de recorrerse la nueva base de datos realizando calculos y actualizando registros (UPDATE) . Esto lo hago con un LOOP FOR EACH

    4.- Llamar a otro paquete2 que se encarga de recorrerse la nueva base de datos realizando calculos y actualizando registros (UPDATE) . Esto lo hago con un LOOP FOR EACH

    Estos dos ultimos pasos son los que especialmente tardan cuando lo lanzo desde Management (conectándote al servidor de Integration Services, Stodes Packaged) pero desde BIDS va muy bien.

    jueves, 17 de noviembre de 2011 10:57
  • Hola. Indícanos por favor la versión de SQL Server y si éste corre a 32 bits o a 64 bits. Digo porque en alguna ocasión me enfrenté a un problema similar y pues el BIDS era de 64 y luego al pasar a ejecutar desde el SSMS, de 32 bits, tuve inconvenientes particularmente con una conexión hacia Oracle 11.

    Gracias y saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    jueves, 17 de noviembre de 2011 11:16
  • No, todo es en 32 bits.
    jueves, 17 de noviembre de 2011 11:56
  • Entiendo. Entonces nada, a capturar trazas, como te sugiere Alberto... En los libros en línea de SQL Server, consulta esta sección Introducción a SQL Server Profiler y ahí te explica como capturarla e incluso analizarla. Necesitarás dos, una para el BIDS y otra para el SSMS... Cuando las tengas y analices, si quieres una segunda opinión, las compartes mediante otro post, tal vez tengas que compartir el archivo porque puede ser grande, y ahí con gusto te colaboramos.

    Saludos,

     

     


    Guillermo Taylor F.

    IT Pro & Xbox gamer

    My blog

    jueves, 17 de noviembre de 2011 12:54
  • Un foreach con un select y un update ?.

    Definitivamente es eso. Si nos pasas mas datos de tu tabla y que quieres hacer, te podemos ayudar a transformarlo en un T-SQL en el execute SQL. Más feo, menos visual, pero muuuucho más rápido.

     


    MVP MCT MCTS Daniel Calbimonte

    http://elpaladintecnologico.blogspot.com
    jueves, 17 de noviembre de 2011 21:50
  • Perdon por el retraso, es que he estado muy ocupado desde entonces.

    Primero hago (tarea Execute Sql) un resulset de la tabla que voy a ir modificando (select andt_codtti, andt_codtic, anti_solucinado, anti_priodidad, andt_tiempo, andt_fecsol, andt_codlot from tbh9andt, tbh9anti, tbh9anda where andt_codtic = anti_codtic and andt_codtic = anda_codtic and anda_codtic = anti_codtic and andt_codtti in ('INC', 'CON') and anda_codest = 2 and anda_codlot in (select distinct anin_lote from tbh9anin) and anti_solucinado = 'S' order by andt_codtic;)

    Me recorro dicho resulset hasta el final en un bucle foreach, y por cada registro hago:

    1-. Una tarea Execute Sql buscando un registro concreto (SELECT   TOP (1)  ANDA_TIEMPO FROM TBH9ANDA WHERE (ANDA_CODTIC = ?) AND ANDA_CODEST = 2 ORDER BY ANDA_FECCOM, ANDA_FECSOL;) y me guardo este valor

    2-. Una tarea Execute Sql buscando un registro concreto (SELECT   top 1 ANIN_min_TPRS, ANIN_obj_TPRS, ANIN_min_TRS, ANIN_obj_TRS,  ANIN_min_TRMU, ANIN_obj_TRMU,  ANIN_min_TRU, ANIN_obj_TRU,  ANIN_min_TRN, ANIN_obj_TRN
    FROM TBH9ANIN WHERE (ANIN_LOTE = ?) AND ANIN_F_DESDE <= ? AND ANIN_F_HASTA >= ?;) y me guardo estos valores

    3.- Con una tarea Script proceso estos valores que he obtenido en los dos pasos anteriores:

            If CDec(Dts.Variables("varTPRS").Value) > CDec(Dts.Variables("varTPRSmin").Value) Then
                Dts.Variables("varTPRSfuera").Value = 1
                Dts.Variables("varTPRSdentro").Value = 0
            Else
                Dts.Variables("varTPRSfuera").Value = 0
                Dts.Variables("varTPRSdentro").Value = 1
            End If
            If CDec(Dts.Variables("varTIEMPO").Value) > CDec(Dts.Variables("varTRSmin").Value) Then
                Dts.Variables("varTRSfuera").Value = 1
                Dts.Variables("varTRSdentro").Value = 0
            Else
                Dts.Variables("varTRSfuera").Value = 0
                Dts.Variables("varTRSdentro").Value = 1
            End If

    4.- Una vez obtenidas estas variables, mediante una tarea Execute Sql, las actualizo en el registro del resulset que estoy tratando en el foreach (update tbh9andt set andt_tprs_tiempo = ?, andt_tprs_fuera = ?, andt_tprs_dentro = ?, andt_trs_tiempo = ?, andt_trs_fuera = ?, andt_trs_dentro = ? where andt_codtic = ?;)

    Un saludo.

    jueves, 24 de noviembre de 2011 16:54