Super Consulta

17/09/2004 - 10:36 por Mondher | Informe spam
Hola a todos,

Tengo una consulta que me tarda 15 segundos en unos
servidores y en otros 6 minutos !!!

La consulta es la siguiente si alguien tiene un poco de
paciencia y me la puede hechar un vistazo


muchas gracias

SET STATISTICS IO ON
SELECT Varios.Descrip, OT.Codigo, OT.CodDpto + '/' +
OT.CodObra + '-' + LTRIM(OT.Indice) +
(CASE WHEN OT.CodOficina IS NULL THEN '' ELSE '/' + right
(ltrim(OT.CodOficina +100),2) end) AS Obra,
OT.CodDptoDestino + '/' + OT.CodObra2
+ '-' + LTRIM(OT.Indice2) + (CASE WHEN OT.PrevPA3 IS NULL
THEN '' ELSE '/' + right(ltrim(OT.PrevPA3 +100),2) end) AS
OT2, TCodigos.Descrip as
MarcaTexto, '01/01/' + LTRIM(OT.Año) as Fecha2 ,
OT.NSIE, Clientes.Nombre, OT.DescTrabajo,OT.FInicio +
OT.Plazo as FFin,OT.Importe,
OT.GradoAvance,OT.GradoAvanceMes,Prevision1, Prevision2,
Prevision3, OT.CodDpto, OT.CodObra, OT.Indice,
OT.Revision,OT.FInicio, OT.Usuario,
OT.Hora, Actividades.Descripcion, OT.TipoOT, OT.TipoOT2,
OT.RetencionInfor, OT.Interna, OT.Estado,
FacturacionDpto, OT.CodDptoDestino,
OT.CodObra2, OT.Indice2, OT.Plazo,
OT.CodigoActividad,OT.CodigoCliente, OT.Campo2,
OT.CodDptoFactura,OT.AlcanceTra,OT.RefOferta, OT.Marca,
OT.CodOficina, OT.PrevPA3, OT.PrecioCerrado,
OT.AlcanceTra, MargenSIE.SIEAcumProd,
MargenSIE.SIETotalAcum, MargenSIE.SIETotProvis,
OTProd.OTMesProd, OTProd.OTAcumProd, OTProd.OTPrevision1,
OTProd.OTPrevision2, OTProd.OTPrevision3,
OT.ParticipacionAjena , H.AcumProd, H.MesProd,
OT.PresupuestoCoste, VCP.TotalAcum, VCP.TotalMes,
SIEUNICO.Codigo AS CODSIEUNICO, (CASE WHEN OT.Interna IS
NULL THEN OT.CodDpto WHEN OT.Interna
IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.CodDptoDestino ELSE NULL END) + '/' + (CASE WHEN
OT.interna IS NULL THEN OT.CodObra WHEN
OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AS CodOTProd, H.Campo8
FROM (((((((((OT LEFT JOIN Actividades ON
OT.CodigoActividad = Actividades.Codigo)
LEFT JOIN Clientes ON OT.CodigoCliente = Clientes.Codigo)
LEFT JOIN Varios ON (OT.PrecioCerrado) = Varios.Codigo)
LEFT JOIN TCodigos ON (OT.Marca) = TCodigos.Codigo) LEFT
JOIN Vis_CostesPresupuestados VCP ON VCP.NSIE = OT.NSIE
AND VCP.Marca = OT.Marca
AND VCP.Mes = '01/08/2004' ) LEFT JOIN
HistoricoProduccion H ON H.Campo5 = OT.Codigo AND H.Fecha
= '01/08/2004' )
LEFT JOIN ( Select Codigo From OT WHERE NSIE + Ltrim
(Marca) IN (SELECT NSIE + Ltrim(Marca) AS NSIEMarca
From OT GROUP BY NSIE, Marca HAVING COUNT(Codigo) =
1) ) SIEUNICO ON OT.Codigo = SIEUNICO.Codigo )
LEFT JOIN ( SELECT OT.NSIE, OT.Marca, CP.TotalAcum AS
SIETotalAcum , SUM(H.AcumProd) as SIEAcumProd,
Provis.Importe as SIETotProvis
FROM OT INNER JOIN HistoricoProduccion H ON OT.Codigo =
H.Campo5 AND Fecha = '01/08/2004' LEFT JOIN (SELECT NSIE,
Marca, SUM(TotalAcum) as
TotalAcum From Vis_CostesPresupuestados WHERE Mes
= '01/08/2004' AND CodDpto = '111' GROUP BY NSIE , MARCA)
CP ON CP.NSIE = OT.NSIE
AND CP.Marca = OT.Marca LEFT Join (SELECT VPR.NSIE,
VPR.Marca, SUM(VPR.Importe) as Importe FROM
Vis_Provisiones VP INNER JOIN
Vis_ProvisionesReparto VPR ON VP.CodProvision =
VPR.CodProvision WHERE (FCierre > '01/08/2004' or fcierre
is null) AND CODDPTO = '111'
GROUP BY VPR.NSIE, VPR.Marca) Provis ON PROVIS.NSIE =
OT.NSIE AND PROVIS.Marca = OT.Marca GROUP BY OT.NSIE,
OT.Marca, TotalAcum, Provis.Importe )
MargenSIE ON MargenSIE.NSIE = OT.NSIE AND MargenSIE.Marca
= OT.Marca) LEFT JOIN ( SELECT Año, (CASE WHEN OT.Interna
IS NULL THEN OT.CodDpto
WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.CodDptoDestino ELSE NULL END) AS Dpto, (CASE WHEN
OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) AS Obra, SUM
(H.MesProd) as OTMesProd,
SUM(H.AcumProd) As OTAcumProd, SUM(H.Prev1) as
OTPrevision1, SUM(H.Prev2) as OTPrevision2, SUM(H.Prev3)
as OTPrevision3 From OT INNER JOIN
HistoricoProduccion H ON OT.Codigo = H.Campo5 AND Fecha
= '01/08/2004' Where (OT.CodDpto = '111' AND OT.Indice <>
0 AND OT.Interna IS NULL
OR OT.CodDptoDestino = '111' AND OT.Indice2 <> 0 AND
OT.Interna IS NOT NULL ) AND H.Fecha = '01/08/2004' Group
By AÑO, (CASE WHEN OT.Interna
IS NULL THEN OT.CodDpto WHEN OT.Interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.CodDptoDestino ELSE NULL
END) , (CASE WHEN OT.interna IS
NULL THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.Codobra2 ELSE NULL END))
OTProd ON OTProd.Año = OT.Año AND
OTProd.Dpto = (CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.CodDptoDestino ELSE
NULL END) AND OTProd.Obra = (CASE WHEN OT.interna IS NULL
THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AND (OT.CodigoCliente = 0 OR
OT.CodigoActividad = 0) ) WHERE (OT.RetencionInfor <> 'SI'
or OT.RetencionInfor is null)
AND ( OT.INTERNA IS NULL AND OT.CodDpto='111' OR
INTERNA IS NOT NULL AND OT.CodDpto = '111' AND (Estado =
20002) AND FacturacionDpto = 0
OR INTERNA IS NOT NULL AND OT.CodDptoDestino = '111' AND
(Estado = 20002) AND FacturacionDpto = 1 OR INTERNA IS
NOT NULL AND OT.CodDptoDestino
= '111' AND (Estado = 20002) AND FacturacionDpto = 0
AND PrecioCerrado = 1 ) ORDER BY OT.NSIE, OT.Marca,
(CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.CodDptoDestino ELSE NULL END), (CASE
WHEN OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) , (CASE WHEN
OT.interna IS NULL THEN OT.Indice
WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.Indice2 ELSE NULL END)

Preguntas similare

Leer las respuestas

#1 qwalgrande
17/09/2004 - 11:39 | Informe spam
Hola.

Si en unos servidores tarda un tiempo y en otros mucho menos, se puede deber
a varias cosas. Una es el nivel de aislamiento, es posible que la consulta se
esté viendo bloqueada en algún caso. Otro es la diferente indexación en los
servidores. Con la misma indexación, cada servidor puede realizar un plan de
ejecución distinto. Veo que estás mirando las lecturas que realiza la
consulta. Estudia esas lecturas y trata de reducirlas al máximo. Si además
los servidores tienen prestaciones diferentes, es normal esas diferencias de
tiempo.

qwalgrande


"Mondher" wrote:

Hola a todos,

Tengo una consulta que me tarda 15 segundos en unos
servidores y en otros 6 minutos !!!

La consulta es la siguiente si alguien tiene un poco de
paciencia y me la puede hechar un vistazo


muchas gracias

SET STATISTICS IO ON
SELECT Varios.Descrip, OT.Codigo, OT.CodDpto + '/' +
OT.CodObra + '-' + LTRIM(OT.Indice) +
(CASE WHEN OT.CodOficina IS NULL THEN '' ELSE '/' + right
(ltrim(OT.CodOficina +100),2) end) AS Obra,
OT.CodDptoDestino + '/' + OT.CodObra2
+ '-' + LTRIM(OT.Indice2) + (CASE WHEN OT.PrevPA3 IS NULL
THEN '' ELSE '/' + right(ltrim(OT.PrevPA3 +100),2) end) AS
OT2, TCodigos.Descrip as
MarcaTexto, '01/01/' + LTRIM(OT.Año) as Fecha2 ,
OT.NSIE, Clientes.Nombre, OT.DescTrabajo,OT.FInicio +
OT.Plazo as FFin,OT.Importe,
OT.GradoAvance,OT.GradoAvanceMes,Prevision1, Prevision2,
Prevision3, OT.CodDpto, OT.CodObra, OT.Indice,
OT.Revision,OT.FInicio, OT.Usuario,
OT.Hora, Actividades.Descripcion, OT.TipoOT, OT.TipoOT2,
OT.RetencionInfor, OT.Interna, OT.Estado,
FacturacionDpto, OT.CodDptoDestino,
OT.CodObra2, OT.Indice2, OT.Plazo,
OT.CodigoActividad,OT.CodigoCliente, OT.Campo2,
OT.CodDptoFactura,OT.AlcanceTra,OT.RefOferta, OT.Marca,
OT.CodOficina, OT.PrevPA3, OT.PrecioCerrado,
OT.AlcanceTra, MargenSIE.SIEAcumProd,
MargenSIE.SIETotalAcum, MargenSIE.SIETotProvis,
OTProd.OTMesProd, OTProd.OTAcumProd, OTProd.OTPrevision1,
OTProd.OTPrevision2, OTProd.OTPrevision3,
OT.ParticipacionAjena , H.AcumProd, H.MesProd,
OT.PresupuestoCoste, VCP.TotalAcum, VCP.TotalMes,
SIEUNICO.Codigo AS CODSIEUNICO, (CASE WHEN OT.Interna IS
NULL THEN OT.CodDpto WHEN OT.Interna
IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.CodDptoDestino ELSE NULL END) + '/' + (CASE WHEN
OT.interna IS NULL THEN OT.CodObra WHEN
OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AS CodOTProd, H.Campo8
FROM (((((((((OT LEFT JOIN Actividades ON
OT.CodigoActividad = Actividades.Codigo)
LEFT JOIN Clientes ON OT.CodigoCliente = Clientes.Codigo)
LEFT JOIN Varios ON (OT.PrecioCerrado) = Varios.Codigo)
LEFT JOIN TCodigos ON (OT.Marca) = TCodigos.Codigo) LEFT
JOIN Vis_CostesPresupuestados VCP ON VCP.NSIE = OT.NSIE
AND VCP.Marca = OT.Marca
AND VCP.Mes = '01/08/2004' ) LEFT JOIN
HistoricoProduccion H ON H.Campo5 = OT.Codigo AND H.Fecha
= '01/08/2004' )
LEFT JOIN ( Select Codigo From OT WHERE NSIE + Ltrim
(Marca) IN (SELECT NSIE + Ltrim(Marca) AS NSIEMarca
From OT GROUP BY NSIE, Marca HAVING COUNT(Codigo) =
1) ) SIEUNICO ON OT.Codigo = SIEUNICO.Codigo )
LEFT JOIN ( SELECT OT.NSIE, OT.Marca, CP.TotalAcum AS
SIETotalAcum , SUM(H.AcumProd) as SIEAcumProd,
Provis.Importe as SIETotProvis
FROM OT INNER JOIN HistoricoProduccion H ON OT.Codigo =
H.Campo5 AND Fecha = '01/08/2004' LEFT JOIN (SELECT NSIE,
Marca, SUM(TotalAcum) as
TotalAcum From Vis_CostesPresupuestados WHERE Mes
= '01/08/2004' AND CodDpto = '111' GROUP BY NSIE , MARCA)
CP ON CP.NSIE = OT.NSIE
AND CP.Marca = OT.Marca LEFT Join (SELECT VPR.NSIE,
VPR.Marca, SUM(VPR.Importe) as Importe FROM
Vis_Provisiones VP INNER JOIN
Vis_ProvisionesReparto VPR ON VP.CodProvision =
VPR.CodProvision WHERE (FCierre > '01/08/2004' or fcierre
is null) AND CODDPTO = '111'
GROUP BY VPR.NSIE, VPR.Marca) Provis ON PROVIS.NSIE =
OT.NSIE AND PROVIS.Marca = OT.Marca GROUP BY OT.NSIE,
OT.Marca, TotalAcum, Provis.Importe )
MargenSIE ON MargenSIE.NSIE = OT.NSIE AND MargenSIE.Marca
= OT.Marca) LEFT JOIN ( SELECT Año, (CASE WHEN OT.Interna
IS NULL THEN OT.CodDpto
WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.CodDptoDestino ELSE NULL END) AS Dpto, (CASE WHEN
OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) AS Obra, SUM
(H.MesProd) as OTMesProd,
SUM(H.AcumProd) As OTAcumProd, SUM(H.Prev1) as
OTPrevision1, SUM(H.Prev2) as OTPrevision2, SUM(H.Prev3)
as OTPrevision3 From OT INNER JOIN
HistoricoProduccion H ON OT.Codigo = H.Campo5 AND Fecha
= '01/08/2004' Where (OT.CodDpto = '111' AND OT.Indice <>
0 AND OT.Interna IS NULL
OR OT.CodDptoDestino = '111' AND OT.Indice2 <> 0 AND
OT.Interna IS NOT NULL ) AND H.Fecha = '01/08/2004' Group
By AÑO, (CASE WHEN OT.Interna
IS NULL THEN OT.CodDpto WHEN OT.Interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.CodDptoDestino ELSE NULL
END) , (CASE WHEN OT.interna IS
NULL THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.Codobra2 ELSE NULL END))
OTProd ON OTProd.Año = OT.Año AND
OTProd.Dpto = (CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.CodDptoDestino ELSE
NULL END) AND OTProd.Obra = (CASE WHEN OT.interna IS NULL
THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AND (OT.CodigoCliente = 0 OR
OT.CodigoActividad = 0) ) WHERE (OT.RetencionInfor <> 'SI'
or OT.RetencionInfor is null)
AND ( OT.INTERNA IS NULL AND OT.CodDpto='111' OR
INTERNA IS NOT NULL AND OT.CodDpto = '111' AND (Estado =
20002) AND FacturacionDpto = 0
OR INTERNA IS NOT NULL AND OT.CodDptoDestino = '111' AND
(Estado = 20002) AND FacturacionDpto = 1 OR INTERNA IS
NOT NULL AND OT.CodDptoDestino
= '111' AND (Estado = 20002) AND FacturacionDpto = 0
AND PrecioCerrado = 1 ) ORDER BY OT.NSIE, OT.Marca,
(CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.CodDptoDestino ELSE NULL END), (CASE
WHEN OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) , (CASE WHEN
OT.interna IS NULL THEN OT.Indice
WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.Indice2 ELSE NULL END)



Respuesta Responder a este mensaje
#2 Mondher
17/09/2004 - 12:26 | Informe spam
Los servidores tienen los mismos indices, y en algun caso
tarda más en un servidor muy potente y con Windows 2000
que en otro de menos prestaciones más aplicaciones y con
NT.

El resultado de las estadisticas es el siguiente: La misma
consulta me dio dos resultados distintos (cambia el orden)


Tabla 'Varios'. Número de exploraciones 97, lecturas
lógicas 243, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'TCodigos'. Número de exploraciones 97, lecturas
lógicas 340, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'Actividades'. Número de exploraciones 97, lecturas
lógicas 243, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'Clientes'. Número de exploraciones 2, lecturas
lógicas 819, lecturas físicas 0, lecturas anticipadas 8.
Tabla 'OT'. Número de exploraciones 10, lecturas lógicas
47050, lecturas físicas 0, lecturas anticipadas 8.
Tabla 'CostesPresupuestados'. Número de exploraciones 4,
lecturas lógicas 506, lecturas físicas 0, lecturas
anticipadas 344.
Tabla 'HistoricoProduccion'. Número de exploraciones 713,
lecturas lógicas 52903, lecturas físicas 0, lecturas
anticipadas 0.
Tabla 'ProvisionesReparto'. Número de exploraciones 1,
lecturas lógicas 2, lecturas físicas 0, lecturas
anticipadas 0.
Tabla 'Provisiones'. Número de exploraciones 40, lecturas
lógicas 100, lecturas físicas 0, lecturas anticipadas 0.


Muchas gracias.


Hola.

Si en unos servidores tarda un tiempo y en otros mucho


menos, se puede deber
a varias cosas. Una es el nivel de aislamiento, es


posible que la consulta se
esté viendo bloqueada en algàºn caso. Otro es la


diferente indexación en los
servidores. Con la misma indexación, cada servidor puede


realizar un plan de
ejecución distinto. Veo que està¡s mirando las lecturas


que realiza la
consulta. Estudia esas lecturas y trata de reducirlas al


mà¡ximo. Si ademà¡s
los servidores tienen prestaciones diferentes, es normal


esas diferencias de
tiempo.

qwalgrande


"Mondher" wrote:

Hola a todos,

Tengo una consulta que me tarda 15 segundos en unos
servidores y en otros 6 minutos !!!

La consulta es la siguiente si alguien tiene un poco de
paciencia y me la puede hechar un vistazo


muchas gracias

SET STATISTICS IO ON
SELECT Varios.Descrip, OT.Codigo, OT.CodDpto + '/' +
OT.CodObra + '-' + LTRIM(OT.Indice) +
(CASE WHEN OT.CodOficina IS NULL THEN '' ELSE '/' +




right
(ltrim(OT.CodOficina +100),2) end) AS Obra,
OT.CodDptoDestino + '/' + OT.CodObra2
+ '-' + LTRIM(OT.Indice2) + (CASE WHEN OT.PrevPA3 IS




NULL
THEN '' ELSE '/' + right(ltrim(OT.PrevPA3 +100),2) end)




AS
OT2, TCodigos.Descrip as
MarcaTexto, '01/01/' + LTRIM(OT.Aà±o) as Fecha2 ,
OT.NSIE, Clientes.Nombre, OT.DescTrabajo,OT.FInicio +
OT.Plazo as FFin,OT.Importe,
OT.GradoAvance,OT.GradoAvanceMes,Prevision1,




Prevision2,
Prevision3, OT.CodDpto, OT.CodObra, OT.Indice,
OT.Revision,OT.FInicio, OT.Usuario,
OT.Hora, Actividades.Descripcion, OT.TipoOT,




OT.TipoOT2,
OT.RetencionInfor, OT.Interna, OT.Estado,
FacturacionDpto, OT.CodDptoDestino,
OT.CodObra2, OT.Indice2, OT.Plazo,
OT.CodigoActividad,OT.CodigoCliente, OT.Campo2,
OT.CodDptoFactura,OT.AlcanceTra,OT.RefOferta, OT.Marca,
OT.CodOficina, OT.PrevPA3, OT.PrecioCerrado,
OT.AlcanceTra, MargenSIE.SIEAcumProd,
MargenSIE.SIETotalAcum, MargenSIE.SIETotProvis,
OTProd.OTMesProd, OTProd.OTAcumProd,




OTProd.OTPrevision1,
OTProd.OTPrevision2, OTProd.OTPrevision3,
OT.ParticipacionAjena , H.AcumProd, H.MesProd,
OT.PresupuestoCoste, VCP.TotalAcum, VCP.TotalMes,
SIEUNICO.Codigo AS CODSIEUNICO, (CASE WHEN OT.Interna




IS
NULL THEN OT.CodDpto WHEN OT.Interna
IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.CodDptoDestino ELSE NULL END) + '/' + (CASE WHEN
OT.interna IS NULL THEN OT.CodObra WHEN
OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AS CodOTProd, H.Campo8
FROM (((((((((OT LEFT JOIN Actividades ON
OT.CodigoActividad = Actividades.Codigo)
LEFT JOIN Clientes ON OT.CodigoCliente =




Clientes.Codigo)
LEFT JOIN Varios ON (OT.PrecioCerrado) =




Varios.Codigo)
LEFT JOIN TCodigos ON (OT.Marca) = TCodigos.Codigo)




LEFT
JOIN Vis_CostesPresupuestados VCP ON VCP.NSIE = OT.NSIE
AND VCP.Marca = OT.Marca
AND VCP.Mes = '01/08/2004' ) LEFT JOIN
HistoricoProduccion H ON H.Campo5 = OT.Codigo AND




H.Fecha
= '01/08/2004' )
LEFT JOIN ( Select Codigo From OT WHERE NSIE + Ltrim
(Marca) IN (SELECT NSIE + Ltrim(Marca) AS NSIEMarca
From OT GROUP BY NSIE, Marca HAVING COUNT(Codigo) =
1) ) SIEUNICO ON OT.Codigo = SIEUNICO.Codigo )
LEFT JOIN ( SELECT OT.NSIE, OT.Marca, CP.TotalAcum AS
SIETotalAcum , SUM(H.AcumProd) as SIEAcumProd,
Provis.Importe as SIETotProvis
FROM OT INNER JOIN HistoricoProduccion H ON OT.Codigo




=
H.Campo5 AND Fecha = '01/08/2004' LEFT JOIN (SELECT




NSIE,
Marca, SUM(TotalAcum) as
TotalAcum From Vis_CostesPresupuestados WHERE Mes
= '01/08/2004' AND CodDpto = '111' GROUP BY NSIE ,




MARCA)
CP ON CP.NSIE = OT.NSIE
AND CP.Marca = OT.Marca LEFT Join (SELECT VPR.NSIE,
VPR.Marca, SUM(VPR.Importe) as Importe FROM
Vis_Provisiones VP INNER JOIN
Vis_ProvisionesReparto VPR ON VP.CodProvision =
VPR.CodProvision WHERE (FCierre > '01/08/2004' or




fcierre
is null) AND CODDPTO = '111'
GROUP BY VPR.NSIE, VPR.Marca) Provis ON PROVIS.NSIE =
OT.NSIE AND PROVIS.Marca = OT.Marca GROUP BY OT.NSIE,
OT.Marca, TotalAcum, Provis.Importe )
MargenSIE ON MargenSIE.NSIE = OT.NSIE AND




MargenSIE.Marca
= OT.Marca) LEFT JOIN ( SELECT Aà±o, (CASE WHEN




OT.Interna
IS NULL THEN OT.CodDpto
WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.CodDptoDestino ELSE NULL END) AS Dpto, (CASE




WHEN
OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2




IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) AS Obra, SUM
(H.MesProd) as OTMesProd,
SUM(H.AcumProd) As OTAcumProd, SUM(H.Prev1) as
OTPrevision1, SUM(H.Prev2) as OTPrevision2, SUM




(H.Prev3)
as OTPrevision3 From OT INNER JOIN
HistoricoProduccion H ON OT.Codigo = H.Campo5 AND Fecha
= '01/08/2004' Where (OT.CodDpto = '111' AND OT.Indice




<>
0 AND OT.Interna IS NULL
OR OT.CodDptoDestino = '111' AND OT.Indice2 <> 0 AND
OT.Interna IS NOT NULL ) AND H.Fecha = '01/08/2004'




Group
By Aà'O, (CASE WHEN OT.Interna
IS NULL THEN OT.CodDpto WHEN OT.Interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.CodDptoDestino ELSE




NULL
END) , (CASE WHEN OT.interna IS
NULL THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN OT.Codobra2 ELSE NULL




END))
OTProd ON OTProd.Aà±o = OT.Aà±o AND
OTProd.Dpto = (CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2




IS
NOT NULL THEN OT.CodDptoDestino ELSE
NULL END) AND OTProd.Obra = (CASE WHEN OT.interna IS




NULL
THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
OT.CodObra2 IS NOT NULL THEN
OT.Codobra2 ELSE NULL END) AND (OT.CodigoCliente = 0




OR
OT.CodigoActividad = 0) ) WHERE (OT.RetencionInfor




<> 'SI'
or OT.RetencionInfor is null)
AND ( OT.INTERNA IS NULL AND OT.CodDpto='111' OR
INTERNA IS NOT NULL AND OT.CodDpto = '111' AND (Estado




=
20002) AND FacturacionDpto = 0
OR INTERNA IS NOT NULL AND OT.CodDptoDestino = '111'




AND
(Estado = 20002) AND FacturacionDpto = 1 OR INTERNA




IS
NOT NULL AND OT.CodDptoDestino
= '111' AND (Estado = 20002) AND FacturacionDpto = 0
AND PrecioCerrado = 1 ) ORDER BY OT.NSIE, OT.Marca,
(CASE WHEN OT.Interna IS NULL THEN
OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2




IS
NOT NULL THEN OT.CodDptoDestino ELSE NULL END), (CASE
WHEN OT.interna IS NULL THEN
OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2




IS
NOT NULL THEN OT.Codobra2 ELSE NULL END) , (CASE WHEN
OT.interna IS NULL THEN OT.Indice
WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
THEN OT.Indice2 ELSE NULL END)





.

Respuesta Responder a este mensaje
#3 qwalgrande
17/09/2004 - 14:49 | Informe spam
Hola.

Sólo adjuntas las estadísticas de una consulta. Compara los planes de
ejecución para vers si son iguales. Por el número de lecturas lógicas que
veo, son unas 100.000, lo cual no debe representar mucho tiempo. ¿Es del
servidor que tarda 15 segundos? Prueba a lanzar las consultas con un set
transaction isolation level read uncommitted (por si fueran bloqueos).
También pueden ser otras razones, lo podrás ver comparando los planes de
ejecución y las lecturas de ambas. Si nos lo pasas, igual podemos ayudarte.

qwalgrande

"Mondher" wrote:

Los servidores tienen los mismos indices, y en algun caso
tarda más en un servidor muy potente y con Windows 2000
que en otro de menos prestaciones más aplicaciones y con
NT.

El resultado de las estadisticas es el siguiente: La misma
consulta me dio dos resultados distintos (cambia el orden)


Tabla 'Varios'. Número de exploraciones 97, lecturas
lógicas 243, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'TCodigos'. Número de exploraciones 97, lecturas
lógicas 340, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'Actividades'. Número de exploraciones 97, lecturas
lógicas 243, lecturas físicas 0, lecturas anticipadas 0.
Tabla 'Clientes'. Número de exploraciones 2, lecturas
lógicas 819, lecturas físicas 0, lecturas anticipadas 8.
Tabla 'OT'. Número de exploraciones 10, lecturas lógicas
47050, lecturas físicas 0, lecturas anticipadas 8.
Tabla 'CostesPresupuestados'. Número de exploraciones 4,
lecturas lógicas 506, lecturas físicas 0, lecturas
anticipadas 344.
Tabla 'HistoricoProduccion'. Número de exploraciones 713,
lecturas lógicas 52903, lecturas físicas 0, lecturas
anticipadas 0.
Tabla 'ProvisionesReparto'. Número de exploraciones 1,
lecturas lógicas 2, lecturas físicas 0, lecturas
anticipadas 0.
Tabla 'Provisiones'. Número de exploraciones 40, lecturas
lógicas 100, lecturas físicas 0, lecturas anticipadas 0.


Muchas gracias.


>Hola.
>
>Si en unos servidores tarda un tiempo y en otros mucho
menos, se puede deber
>a varias cosas. Una es el nivel de aislamiento, es
posible que la consulta se
>esté viendo bloqueada en algàºn caso. Otro es la
diferente indexación en los
>servidores. Con la misma indexación, cada servidor puede
realizar un plan de
>ejecución distinto. Veo que està¡s mirando las lecturas
que realiza la
>consulta. Estudia esas lecturas y trata de reducirlas al
mà¡ximo. Si ademà¡s
>los servidores tienen prestaciones diferentes, es normal
esas diferencias de
>tiempo.
>
>qwalgrande
>
>
>"Mondher" wrote:
>
>> Hola a todos,
>>
>> Tengo una consulta que me tarda 15 segundos en unos
>> servidores y en otros 6 minutos !!!
>>
>> La consulta es la siguiente si alguien tiene un poco de
>> paciencia y me la puede hechar un vistazo
>>
>>
>> muchas gracias
>>
>> SET STATISTICS IO ON
>> SELECT Varios.Descrip, OT.Codigo, OT.CodDpto + '/' +
>> OT.CodObra + '-' + LTRIM(OT.Indice) +
>> (CASE WHEN OT.CodOficina IS NULL THEN '' ELSE '/' +
right
>> (ltrim(OT.CodOficina +100),2) end) AS Obra,
>> OT.CodDptoDestino + '/' + OT.CodObra2
>> + '-' + LTRIM(OT.Indice2) + (CASE WHEN OT.PrevPA3 IS
NULL
>> THEN '' ELSE '/' + right(ltrim(OT.PrevPA3 +100),2) end)
AS
>> OT2, TCodigos.Descrip as
>> MarcaTexto, '01/01/' + LTRIM(OT.Aà±o) as Fecha2 ,
>> OT.NSIE, Clientes.Nombre, OT.DescTrabajo,OT.FInicio +
>> OT.Plazo as FFin,OT.Importe,
>> OT.GradoAvance,OT.GradoAvanceMes,Prevision1,
Prevision2,
>> Prevision3, OT.CodDpto, OT.CodObra, OT.Indice,
>> OT.Revision,OT.FInicio, OT.Usuario,
>> OT.Hora, Actividades.Descripcion, OT.TipoOT,
OT.TipoOT2,
>> OT.RetencionInfor, OT.Interna, OT.Estado,
>> FacturacionDpto, OT.CodDptoDestino,
>> OT.CodObra2, OT.Indice2, OT.Plazo,
>> OT.CodigoActividad,OT.CodigoCliente, OT.Campo2,
>> OT.CodDptoFactura,OT.AlcanceTra,OT.RefOferta, OT.Marca,
>> OT.CodOficina, OT.PrevPA3, OT.PrecioCerrado,
>> OT.AlcanceTra, MargenSIE.SIEAcumProd,
>> MargenSIE.SIETotalAcum, MargenSIE.SIETotProvis,
>> OTProd.OTMesProd, OTProd.OTAcumProd,
OTProd.OTPrevision1,
>> OTProd.OTPrevision2, OTProd.OTPrevision3,
>> OT.ParticipacionAjena , H.AcumProd, H.MesProd,
>> OT.PresupuestoCoste, VCP.TotalAcum, VCP.TotalMes,
>> SIEUNICO.Codigo AS CODSIEUNICO, (CASE WHEN OT.Interna
IS
>> NULL THEN OT.CodDpto WHEN OT.Interna
>> IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
>> OT.CodDptoDestino ELSE NULL END) + '/' + (CASE WHEN
>> OT.interna IS NULL THEN OT.CodObra WHEN
>> OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL THEN
>> OT.Codobra2 ELSE NULL END) AS CodOTProd, H.Campo8
>> FROM (((((((((OT LEFT JOIN Actividades ON
>> OT.CodigoActividad = Actividades.Codigo)
>> LEFT JOIN Clientes ON OT.CodigoCliente =
Clientes.Codigo)
>> LEFT JOIN Varios ON (OT.PrecioCerrado) =
Varios.Codigo)
>> LEFT JOIN TCodigos ON (OT.Marca) = TCodigos.Codigo)
LEFT
>> JOIN Vis_CostesPresupuestados VCP ON VCP.NSIE = OT.NSIE
>> AND VCP.Marca = OT.Marca
>> AND VCP.Mes = '01/08/2004' ) LEFT JOIN
>> HistoricoProduccion H ON H.Campo5 = OT.Codigo AND
H.Fecha
>> = '01/08/2004' )
>> LEFT JOIN ( Select Codigo From OT WHERE NSIE + Ltrim
>> (Marca) IN (SELECT NSIE + Ltrim(Marca) AS NSIEMarca
>> From OT GROUP BY NSIE, Marca HAVING COUNT(Codigo) =
>> 1) ) SIEUNICO ON OT.Codigo = SIEUNICO.Codigo )
>> LEFT JOIN ( SELECT OT.NSIE, OT.Marca, CP.TotalAcum AS
>> SIETotalAcum , SUM(H.AcumProd) as SIEAcumProd,
>> Provis.Importe as SIETotProvis
>> FROM OT INNER JOIN HistoricoProduccion H ON OT.Codigo
=
>> H.Campo5 AND Fecha = '01/08/2004' LEFT JOIN (SELECT
NSIE,
>> Marca, SUM(TotalAcum) as
>> TotalAcum From Vis_CostesPresupuestados WHERE Mes
>> = '01/08/2004' AND CodDpto = '111' GROUP BY NSIE ,
MARCA)
>> CP ON CP.NSIE = OT.NSIE
>> AND CP.Marca = OT.Marca LEFT Join (SELECT VPR.NSIE,
>> VPR.Marca, SUM(VPR.Importe) as Importe FROM
>> Vis_Provisiones VP INNER JOIN
>> Vis_ProvisionesReparto VPR ON VP.CodProvision =
>> VPR.CodProvision WHERE (FCierre > '01/08/2004' or
fcierre
>> is null) AND CODDPTO = '111'
>> GROUP BY VPR.NSIE, VPR.Marca) Provis ON PROVIS.NSIE =
>> OT.NSIE AND PROVIS.Marca = OT.Marca GROUP BY OT.NSIE,
>> OT.Marca, TotalAcum, Provis.Importe )
>> MargenSIE ON MargenSIE.NSIE = OT.NSIE AND
MargenSIE.Marca
>> = OT.Marca) LEFT JOIN ( SELECT Aà±o, (CASE WHEN
OT.Interna
>> IS NULL THEN OT.CodDpto
>> WHEN OT.Interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
>> THEN OT.CodDptoDestino ELSE NULL END) AS Dpto, (CASE
WHEN
>> OT.interna IS NULL THEN
>> OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2
IS
>> NOT NULL THEN OT.Codobra2 ELSE NULL END) AS Obra, SUM
>> (H.MesProd) as OTMesProd,
>> SUM(H.AcumProd) As OTAcumProd, SUM(H.Prev1) as
>> OTPrevision1, SUM(H.Prev2) as OTPrevision2, SUM
(H.Prev3)
>> as OTPrevision3 From OT INNER JOIN
>> HistoricoProduccion H ON OT.Codigo = H.Campo5 AND Fecha
>> = '01/08/2004' Where (OT.CodDpto = '111' AND OT.Indice
<>
>> 0 AND OT.Interna IS NULL
>> OR OT.CodDptoDestino = '111' AND OT.Indice2 <> 0 AND
>> OT.Interna IS NOT NULL ) AND H.Fecha = '01/08/2004'
Group
>> By Aà'O, (CASE WHEN OT.Interna
>> IS NULL THEN OT.CodDpto WHEN OT.Interna IS NOT NULL AND
>> OT.CodObra2 IS NOT NULL THEN OT.CodDptoDestino ELSE
NULL
>> END) , (CASE WHEN OT.interna IS
>> NULL THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
>> OT.CodObra2 IS NOT NULL THEN OT.Codobra2 ELSE NULL
END))
>> OTProd ON OTProd.Aà±o = OT.Aà±o AND
>> OTProd.Dpto = (CASE WHEN OT.Interna IS NULL THEN
>> OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2
IS
>> NOT NULL THEN OT.CodDptoDestino ELSE
>> NULL END) AND OTProd.Obra = (CASE WHEN OT.interna IS
NULL
>> THEN OT.CodObra WHEN OT.interna IS NOT NULL AND
>> OT.CodObra2 IS NOT NULL THEN
>> OT.Codobra2 ELSE NULL END) AND (OT.CodigoCliente = 0
OR
>> OT.CodigoActividad = 0) ) WHERE (OT.RetencionInfor
<> 'SI'
>> or OT.RetencionInfor is null)
>> AND ( OT.INTERNA IS NULL AND OT.CodDpto='111' OR
>> INTERNA IS NOT NULL AND OT.CodDpto = '111' AND (Estado
=
>> 20002) AND FacturacionDpto = 0
>> OR INTERNA IS NOT NULL AND OT.CodDptoDestino = '111'
AND
>> (Estado = 20002) AND FacturacionDpto = 1 OR INTERNA
IS
>> NOT NULL AND OT.CodDptoDestino
>> = '111' AND (Estado = 20002) AND FacturacionDpto = 0
>> AND PrecioCerrado = 1 ) ORDER BY OT.NSIE, OT.Marca,
>> (CASE WHEN OT.Interna IS NULL THEN
>> OT.CodDpto WHEN OT.Interna IS NOT NULL AND OT.CodObra2
IS
>> NOT NULL THEN OT.CodDptoDestino ELSE NULL END), (CASE
>> WHEN OT.interna IS NULL THEN
>> OT.CodObra WHEN OT.interna IS NOT NULL AND OT.CodObra2
IS
>> NOT NULL THEN OT.Codobra2 ELSE NULL END) , (CASE WHEN
>> OT.interna IS NULL THEN OT.Indice
>> WHEN OT.interna IS NOT NULL AND OT.CodObra2 IS NOT NULL
>> THEN OT.Indice2 ELSE NULL END)
>>
>>
>>
>.
>

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida