Principales respuestas
Optimizar query

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
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- Editado Christian AmadoMVP jueves, 2 de octubre de 2014 20:19 between
- Propuesto como respuesta Miguel.Vazquez.MSDNModerator viernes, 17 de octubre de 2014 18:22
- Marcado como respuesta Miguel.Vazquez.MSDNModerator viernes, 17 de octubre de 2014 18:26
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 -
-
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- Editado Christian AmadoMVP jueves, 2 de octubre de 2014 20:19 between
- Propuesto como respuesta Miguel.Vazquez.MSDNModerator viernes, 17 de octubre de 2014 18:22
- Marcado como respuesta Miguel.Vazquez.MSDNModerator viernes, 17 de octubre de 2014 18:26
-
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
-
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