SQL Server Performance

Optimizar consulta SQL

Discussion in 'Preguntas sobre SQL Server en Español.' started by carlosp000, Dec 5, 2008.

  1. carlosp000 New Member

    Que tal amigos, resulta que tengo unos problemas con unos querys de SQLen un paquete de SSIS, en SQL Server 2005 ó lo que se llamaba DTS enSQL Server 2000, el caso es que uno de los querys esta tardando muchoen hacer las operaciones, la tabla contra la que hago el FULL JOINestoy probando con 1200 registros, se esta tardando aproximadamente 6minutos el query, y queria saber de que forma lo puedo optimizar paraque tarde menos, he intentado varias cosas como ahorrar unos SUBSTRINGque debo utilizar para sacar cierto número de digitos y meterlos enotra tabla antes de hacer el join pero aún asi tarda mucho, no estoyusando SELECT * y el DISTINCT lo debo utilizar que he leido que son lascosas que hay que evitar a la hora de optimizar consultas, entre otrascosas. aqui dejo el query para mas o menos poder ilustrar la operación,saludos

    IF (SELECT COUNT(1) FROM cencostos) > 0
    BEGIN
    INSERT CuentasCeco
    SELECT DISTINCT
    SUBSTRING(cod_centro,1,7) +
    SUBSTRING(RTRIM(LTRIM(ISNULL(ACTNUMBR_1,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_2,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_3,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_4,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_5,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_6,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_7,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_8,''))),8,17)
    ,SUBSTRING(ACTDESCR,1,51)
    ,SUBSTRING(RTRIM(LTRIM(ACCTTYPE)),1,3)
    ,SUBSTRING(cod_centro,43,4)
    ,SUBSTRING(cod_centro,1,7)
    FROM cencostos FULL JOIN gl00100 Cu ON 1=1
    WHERE NOT EXISTS(
    SELECT ACTINDX FROM gl00100 WHERE RTRIM(LTRIM(ACTNUMBR_1))+
    RTRIM(LTRIM(ACTNUMBR_2))+
    RTRIM(LTRIM(ACTNUMBR_3))+
    RTRIM(LTRIM(ACTNUMBR_4))+
    RTRIM(LTRIM(ACTNUMBR_5))+
    RTRIM(LTRIM(ACTNUMBR_6))+
    RTRIM(LTRIM(ACTNUMBR_7))+
    RTRIM(LTRIM(ACTNUMBR_8)) = SUBSTRING(cod_centro,1,7)+
    SUBSTRING(RTRIM(LTRIM(cu.ACTNUMBR_1))+
    RTRIM(LTRIM(cu.ACTNUMBR_2))+
    RTRIM(LTRIM(cu.ACTNUMBR_3))+
    RTRIM(LTRIM(cu.ACTNUMBR_4))+
    RTRIM(LTRIM(cu.ACTNUMBR_5))+
    RTRIM(LTRIM(cu.ACTNUMBR_6))+
    RTRIM(LTRIM(cu.ACTNUMBR_7))+
    RTRIM(LTRIM(cu.ACTNUMBR_8)),8,17))
    AND SUBSTRING(cod_centro,1,7) +
    SUBSTRING(RTRIM(LTRIM(ISNULL(ACTNUMBR_1,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_2,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_3,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_4,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_5,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_6,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_7,'')))+
    RTRIM(LTRIM(ISNULL(ACTNUMBR_8,''))),8,17) NOT IN (SELECT Expr1 FROM CuentasCeco)
    END

    INSERT INTO CuentasCeco
    SELECT 'CODIGO_COMPLETO','DESCRIPCION','BCE','CC1','CC2'


    laaplicación importa dos archivos de texto con información de cuentas ycentros de costos, luego eso se combina con la tabla gl00100, y de allise importa otro archivo de texto, que es el producto final que arrojael paquete

    el archivo de costos.txt tiene una estructura como la siguiente:

    3100000VP. EJE. PERSONAS Y NEG COMERCIALES0510

    claro tiene varios registros, esa información se inserta en la tabla cencostos, a través de un BULK INSERT

    el archivo de cuentas.txt tiene un estructura como la siguiente:

    44702100061000044DEPRECIACION DE EQUIPOS AIRE ACONDICIONADO DET

    deigual forma esa información se inserta en la tabla cuentas con el BULKINSERT, antes del query que coloque al principio, hay 2 que leanteceden, gracias.
  2. Luis Martin Moderator

    Bienvenido al Forum!!Te sugiero probar con el DTA para ver si es necesario algún índice en la tabla de lectura.Con respecto a la parte de insert, si esa tabla tiene cluster index, entonces tardará más.Quizás te convenga, antes de ejecutar el SSIS, eliminar los índices, cargar la tabla y agregar nuevamente los índices.Saludos,
  3. carlosp000 New Member

    disculpa mi ignorancia, pero que es el DTA, y que significa cluster index? gracias.
  4. Luis Martin Moderator

    El DTA es el Index Tuning Wizard de 2005.Cluster Index es un índice físico que suelen tener todas las tablas. Al ser físico, cada vez que se inserta alguna fila, se reacomodan el cluster index.Solamente puede haber 1 solo cluster index por tabla.Por el contrario, non cluster index, puede haber más. Dado que es un índice no físico, no genera tanto problema al insertar filas en esas tablas.Para más datos, te suguiero leer el BOL (Book on Line o Libros en línea) que vienen con las herramientas del 2005.

Share This Page