none
Obtener datos de la base de datos RRS feed

  • Pregunta

  • Buenas a todos:

    Tengo el siguiente escenario:

    • Una base de datos Informix con una tabla de pedidos de alrededor de 4 millones de registros. Esta tabla se llena con nuevos pedidos todos los dias. Osea que un dia tengo 4 millones de pedidos y al otro dia tengo otros 4 millones de pedidos nuevos pero se borran los pedidos del dia anterior.
    • La tabla se empieza a llenar a las 24:00hs y se termina de llenar a las 05:30 am.
    • Servidor de SqlSever que tiene a la base de datos de Informix como un Linked-Server
    • La base de datos de SqlServer tiene los StoredProcedures que generan los reportes.

    La idea es obtener unos cuantos reportes de esta tabla. Estos reportes son archivos de texto plano. El tema es que tienen que estar antes de las 09:00am. Y en total se tienen que generar alrededor de 250 archivos.

    El problema de tiempo se genera cuando trato de obtener los datos ya que tardan mucho las consultas que se ejecutan en los stored procedure. Cada stored procedure tiene como parametro la plataforma y la seccion para filtrar.

    La escritura de los archivos se hace rapido, el tema es la obtencion de los datos. Si alguno se le ocurre una forma rapida para generar los archivos, bienvenido sea.

    miércoles, 15 de septiembre de 2010 14:25

Respuestas

  • hola

    como parametro la plataforma y la seccion para filtrar

    has detectado que la tardanza esta en la query ?

    si es asi estos campos de filtro son clave primaria de la tabla, lo pregunto porque quizas agregando indices en la tabla puede mejorar notablemente el acceso en las consultas

    prueba tomas las queries y ejecutarlas en el Sql Management Studio, y visualzia el plan de ejecucion para ver dodne esta la tardanza, esto un DBA lo majeja perfectamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 15 de septiembre de 2010 14:38
  • Lo que hace el SqlServer es traer todos los datos de Informix a una tabla propia y los stored procedure pegan contra esta tabla

    es justamente en la tabla de sql server donde deberias agregar el indice, para optimizar el acceso por determinado campo

    especialmente si este no es clave de la tabla

    puedo asegurarte por experiencia que un indice bien peusto es el dia y la noche en la velocidad de acceso, lo he comprobado, tenia un proceso que procesaba facturacion y recibia archivo mucho archivos, el tema es que esta buscaba y comparaba por el numero de factura, pero ahi estaba el tema ese numero era un campo comun, no era clave, y la verdad el proceso era increiblemente lento, hasta que analizando las queries lo vimos, se creo un indice por ese cambio, y de varios por no decir muchos minutos de procesamiento, se redujo epenas un par de minutos y a veces segundos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 15 de septiembre de 2010 15:10

Todas las respuestas

  • hola

    como parametro la plataforma y la seccion para filtrar

    has detectado que la tardanza esta en la query ?

    si es asi estos campos de filtro son clave primaria de la tabla, lo pregunto porque quizas agregando indices en la tabla puede mejorar notablemente el acceso en las consultas

    prueba tomas las queries y ejecutarlas en el Sql Management Studio, y visualzia el plan de ejecucion para ver dodne esta la tardanza, esto un DBA lo majeja perfectamente

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 15 de septiembre de 2010 14:38
  • Gracias por la respuesta.

    Con respecto a la base de datos de Informix, no tengo acceso para hacer cambios de indices. La tabla esta muy mal hecha. Todos los campos son nvarchar y tiene alrededor de 35 columnas. Pero no se puede cambiar esto ya que sino se caen todo.

    Lo que hace el SqlServer es traer todos los datos de Informix a una tabla propia y los stored procedure pegan contra esta tabla. El stored procedure que tarda es el que importa toda la informacion.

    Este es el stored:

    INSERT INTO LOGDB.dbo.pedpro (cod_pto,ean_art,int_art,des_art,um_pro,uc_pro,min_pro,max_pro,su_pro,upt_pro,vta_med,uni_pro,fec_pro,fec_pre,p1_pro,p2_pro,p3_pro,fuc_alm,dias_vta,dias_stock,per_ped,s_lun,s_mar,s_mie,s_jue,s_vie,s_sab,s_dom,ndi_bpe,pro_psu,dias_rea,cod_pro,mnet_alm,coef,tst_dtm,tst_usr)
        SELECT * FROM OPENQUERY(INFORMIX_INTER_NET,'SELECT cod_pto,ean_art,int_art,des_art,um_pro,uc_pro,min_pro,max_pro,su_pro,upt_pro,vta_med,uni_pro,fec_pro,fec_pre,p1_pro,p2_pro,p3_pro,fuc_alm,dias_vta,dias_stock,per_ped,s_lun,s_mar,s_mie,s_jue,s_vie,s_sab,s_dom,ndi_bpe,pro_psu,dias_rea,cod_pro,mnet_alm,coef,tst_dtm,tst_usr FROM intpedpro')

    UPDATE PEDPRO SET Cod_Pla = dbo.fnProvToPlat(p1_pro)
    UPDATE PEDPRO SET Cod_Sec = dbo.fnProvToSec(p1_pro)

    Como veras es una maraña de campos pero bueno, tengo que trabajar con eso.

    Si ves el query tiene un campo que se llama p1_pro. Este campo contiene la plataforma y la seccion anidadas. (Una porqueria) Entonces el SqlServer se trae toda la info y luego separa esos campos y los graba en columnas. Esa es la parte del Update. Las funcioens son las siguientes.

    Esta obtiene la seccion

    [dbo].[fnProvToSec](
    @Proveedor Int)
                    RETURNS Tinyint
    AS
        BEGIN
                DECLARE @p Tinyint

                SET @p = 0

                IF @Proveedor BETWEEN 69000 AND 99999 BEGIN
                    SET @p = RIGHT(@Proveedor,2)
                END

                IF @Proveedor BETWEEN 160010 AND 990027 BEGIN
                    SET @p = RIGHT(@Proveedor,2)
                END
               
                RETURN @p
    END

    Esta obtiene la plataforma.

    [dbo].[fnProvToPlat]
    (@Proveedor Int)
                    RETURNS INT
    AS
        BEGIN
                DECLARE @p INT

                SET @p = 0

                IF @Proveedor BETWEEN 69000 AND 99999 BEGIN
                    SET @p = SUBSTRING(CONVERT(Nvarchar,@Proveedor),1,2)
                END

                IF @Proveedor BETWEEN 160010 AND 990027 BEGIN
                    SET @p = SUBSTRING(CONVERT(Nvarchar,@Proveedor),2,3)
                END

                RETURN @p
    END

    Saludos

     

    miércoles, 15 de septiembre de 2010 14:57
  • Lo que hace el SqlServer es traer todos los datos de Informix a una tabla propia y los stored procedure pegan contra esta tabla

    es justamente en la tabla de sql server donde deberias agregar el indice, para optimizar el acceso por determinado campo

    especialmente si este no es clave de la tabla

    puedo asegurarte por experiencia que un indice bien peusto es el dia y la noche en la velocidad de acceso, lo he comprobado, tenia un proceso que procesaba facturacion y recibia archivo mucho archivos, el tema es que esta buscaba y comparaba por el numero de factura, pero ahi estaba el tema ese numero era un campo comun, no era clave, y la verdad el proceso era increiblemente lento, hasta que analizando las queries lo vimos, se creo un indice por ese cambio, y de varios por no decir muchos minutos de procesamiento, se redujo epenas un par de minutos y a veces segundos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 15 de septiembre de 2010 15:10