none
Optimizar query RRS feed

  • Pregunta

  • Como puedo optimizar esta query para que tome menos tiempo de ejecucion?


    SELECT contribuyenteID,cuenta, rfc, razonSocial, Direccion, Sucursal,SUM(Activos) Activos, SUM(Cancelados) Cancelados, SUM(Rechazados) Rechazados, SUM(Total) Total, SUM(importeTotal) ImporteTotal                                 FROM VWMCFDIs   WHERE  estaActivo IN (1) AND SucursalEstatus IN (1) AND TimbreEstatusID in ('1') AND  CONVERT(VARCHAR, FechaTimbrado,112) >= '20101001' AND  CONVERT(VARCHAR, FechaTimbrado,112) <= '20141002' AND comisionistaID in ('8','14')                                                                                                                     GROUP BY contribuyenteID,cuenta,rfc,razonSocial, direccion, sucursal 






    • Editado daniiell01 jueves, 2 de octubre de 2014 19:44
    jueves, 2 de octubre de 2014 19:29

Respuestas

  • Quedaria algo asi:

    SELECT contribuyenteID, cuenta, rfc, razonSocial, Direccion, Sucursal,SUM(Activos) Activos, SUM(Cancelados) Cancelados, SUM(Rechazados) Rechazados, SUM(Total) Total, SUM(importeTotal) ImporteTotal                                
    FROM VWMCFDIs   
    WHERE  estaActivo = 1 AND SucursalEstatus = 1 AND TimbreEstatusID 1 
    AND FechaTimbrado BETWEEN '01/10/2010' 
    AND GETDATE() --Esto corresponde a la fecha de hoy
    AND (comisionistaID = 8 OR comisionistaID = 14)
    GROUP BY contribuyenteID,cuenta,rfc,razonSocial, direccion, sucursal

    ¿De cuántos registros estamos hablando?

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile


    jueves, 2 de octubre de 2014 20:17

Todas las respuestas

  • Hola Daniel, antes que nada eliminando las instrucciones IN del Where, directamente = 1.

    Luego que no es necesario convertir la fecha, directamente '01/10/2010'. 

    Comienza por ahí y hecha un vistazo al Execution Plan del SQL.

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    jueves, 2 de octubre de 2014 19:49
  • Ya intente quitando la conversion de la fecha pero toma mas tiempo sin convertir nada..

    Como querian los where?? de la manera que dices

    jueves, 2 de octubre de 2014 19:56
  • Quedaria algo asi:

    SELECT contribuyenteID, cuenta, rfc, razonSocial, Direccion, Sucursal,SUM(Activos) Activos, SUM(Cancelados) Cancelados, SUM(Rechazados) Rechazados, SUM(Total) Total, SUM(importeTotal) ImporteTotal                                
    FROM VWMCFDIs   
    WHERE  estaActivo = 1 AND SucursalEstatus = 1 AND TimbreEstatusID 1 
    AND FechaTimbrado BETWEEN '01/10/2010' 
    AND GETDATE() --Esto corresponde a la fecha de hoy
    AND (comisionistaID = 8 OR comisionistaID = 14)
    GROUP BY contribuyenteID,cuenta,rfc,razonSocial, direccion, sucursal

    ¿De cuántos registros estamos hablando?

    Saludos


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile


    jueves, 2 de octubre de 2014 20:17
  • Muchas gracias por la ayuda, creo que el problema no es en esa parte porque no esta lento el proceso y probe con el query que me diste y incluso es un poco mas tardado, podria ser en la vista donde esta el problema aqui envio el codigo espero puedas ayudarme..

    CREATE VIEW [dbo].[VWMCFDIs] AS      
    SELECT       
     contribuyenteID,      
       Cuenta,      
       rfc,        
       razonSocial,      
       Direccion,      
       estaActivo,       
       comisionistaID,      
       emisorID,      
       Sucursal,        
       SucursalID,  
       FechaTimbrado,  
       FechaSolicitud,  
       --esTimbreOficial,      
       sum(Activos) Activos,        
       sum(Cancelados) Cancelados,        
       sum(Rechazados) Rechazados,      
       SUM(total) Total,      
       metodoDePago,      
       numeroCuenta,  
       TimbreEstatusID,  
       CostoTimbre,
       SUM(importeTotal) ImporteTotal,
       SucursalEstatus  
      FROM        
      (        
       SELECT          
     c.contribuyenteID,      
     c.codigoSC Cuenta,      
     c.rfc,      
     c.razonSocial,      
       isnull(d.calle,'') + ' ' + isnull(d.noExterior,'') + ', ' + isnull(d.colonia,'') + ' ' + isnull(d.localidad,'') + ' ' + isnull(d.municipio,'') + ' '+ isnull(d.estado,'') as Direccion,        
        e.EmisorEstatusID estaActivo,      
        e.razonSocial+' - '+s.nombre Sucursal,         
        com.comisionistaID,      
        e.emisorID,      
        s.sucursalID sucursalID,        
        t.esTimbreOficial,      
        t.FechaTimbrado,    
        t.FechaSolicitud,  
        Activos.Conteo Activos,   
        Cancelados.Conteo Cancelados,        
        Rechazados.Conteo Rechazados,      
        Activos.Conteo + Cancelados.Conteo + Rechazados.Conteo as total,      
        dbo.getAtributoFromXMLText('metodoDePago',t.DocumentoXML) as metodoDePago,      
        dbo.getAtributoFromXMLText('NumCtaPago',t.DocumentoXML) as numeroCuenta,  
        t.TimbreEstatusID,  
     CostoTimbre,     
     CONVERT(money, dbo.getAtributoFromXMLText(' total',t.DocumentoXML)) importeTotal,
     s.estaactivo SucursalEstatus  
       FROM timbres t         
        INNER JOIN contribuyente c ON t.contribuyenteID = c.contribuyenteID         
        INNER JOIN domicilio d ON c.domicilioID = d.domicilioID      
        INNER JOIN sucursales S ON c.sucursalid = S.SucursalID         
        INNER JOIN emisores e ON s.emisorID = e.emisorID         
        INNER JOIN comisionista com ON com.comisionistaID = e.comisionistaID      
        CROSS APPLY        
        (        
       SELECT count(*) Conteo        
       FROM TIMBRES t2        
       WHERE t2.timbreid = t.timbreid        
        AND t2.timbreestatusid = 1        
        ) Activos        
        CROSS APPLY        
        (        
       SELECT count(*) Conteo        
       FROM TIMBRES t2        
       WHERE t2.timbreid = t.timbreid        
        AND t2.timbreestatusid = 2        
        ) Cancelados        
        CROSS APPLY        
        (        
       SELECT count(*) Conteo        
       FROM TIMBRES t2        
       WHERE t2.timbreid = t.timbreid        
        AND t2.timbreestatusid = 3        
        ) Rechazados        
         
      -- AND com.estaActivo = 1      
      --AND e.EmisorEstatusID = 1      
      --AND s.estaActivo = 1      
      --AND P.estaActivo = 1      
             
      ) Datos        
          
    GROUP BY comisionistaID, emisorID, sucursalID, Sucursal, contribuyenteID, Cuenta, rfc, razonSocial,      
       estaActivo, FechaTimbrado, FechaSolicitud, Direccion, metodoDePago, numeroCuenta, TimbreEstatusID, CostoTimbre, importeTotal, SucursalEstatus     
          
         
    GO

    jueves, 2 de octubre de 2014 22:30
  • Hola Daniel, nunca debes usar * en ninguna consulta SQL, pues eso hace que la consulta de por sí sea lenta. Reemplaza eso por el nombre de una columna, caso contrario la performance se verá afectada.

    La otra parte que no me convence es utilizar muchas subconsultas (pero sólo es mi opinión).

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile

    viernes, 3 de octubre de 2014 11:47