Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Uso de Inner Join

Estas en el tema de Uso de Inner Join en el foro de Oracle en Foros del Web. Hola, una consulta, tengo esta sentencia con inner Join y me demora aprox. 7 minutos SELECT a.MdaAlmCod, a.MddTipDoc, a.CDTNroDoc, a.CDTFchTrn, a.MdcCcoCod, b.DDTCodSec, b.DDPNroPda, b.DDTTpoPda, Left(b.DDTItmCod, ...
  #1 (permalink)  
Antiguo 22/04/2008, 11:41
 
Fecha de Ingreso: enero-2008
Mensajes: 63
Antigüedad: 16 años, 9 meses
Puntos: 1
Uso de Inner Join

Hola, una consulta, tengo esta sentencia con inner Join y me demora aprox. 7 minutos

SELECT a.MdaAlmCod,
a.MddTipDoc,
a.CDTNroDoc,
a.CDTFchTrn,
a.MdcCcoCod,
b.DDTCodSec,
b.DDPNroPda,
b.DDTTpoPda,
Left(b.DDTItmCod, 1 ) As PrdProd,
SubString(b.DDTItmCod, 2, 1) As FamProd,
--Case When b.DDTCodSec = 'H' Then SubString(b.DDTItmCod, 3, 6) Else SubString(b.DDTItmCod, 3, 6) End DesProd,
SubString(b.DDTItmCod, 3, 6) DesProd,
SubString(b.DDTItmCod, 9, 2) As VrnProd,
a.CDTRefDoc,
SUM(b.DDTCntKgs) KgsDsp,
SUM((Case When DDTCldPar = '1' Or DDTCldPar = ' ' Or DDTCldPar = '0' Then b.DDTCntUnd Else 0 End)) Und1era,
SUM((Case When DDTCldPar = '2' Then b.DDTCntUnd Else 0 End)) Und2das
FROM CT3T004 a
INNER Join CT3T005 b On
b.MdaAlmCod = a.MdaAlmCod And
b.MddTipDoc = a.MddTipDoc And
b.CDTNroDoc = a.CDTNroDoc
WHERE A.MDAALMCOD = 'CTL'
AND a.MddTipDoc = 'NS'
And a.CDTFchTrn Between pFechaIni And pFechaFin
And b.DDTCodSec = vCodSec
--And a.MdcCcoCod = DECODE(ALLTRIM(vCCsCod),NULL,a.MdcCcoCod, vCCsCod)
--And b.DDTTPOPDA = DECODE(ALLTRIM(vTpoPda),NULL,b.DDTTPOPDA,vTpoPda)
GROUP BY A.MdaAlmCod,
A.MddTipDoc,
A.CDTNroDoc,
CDTFchTrn,
MdcCcoCod,
DDTCodSec,
DDPNroPda,
DDTTpoPda,
b.DDTItmCod,
CDTRefDoc;

con esta sentencia me demora 2 segundos ¿por qué?

SELECT /*+ INDEX (b SYS_C009606) */
a.mdaalmcod, a.mddtipdoc, a.cdtnrodoc, a.cdtfchtrn, a.mdcccocod,
b.ddtcodsec, b.ddpnropda, b.ddttpopda,
LEFT (b.ddtitmcod, 1) AS prdprod,
substring (b.ddtitmcod, 2, 1) AS famprod,
substring (b.ddtitmcod, 3, 6) desprod,
substring (b.ddtitmcod, 9, 2) AS vrnprod, a.cdtrefdoc,
SUM (b.ddtcntkgs) kgsdsp,
SUM ((CASE
WHEN b.ddtcldpar = '1'
OR b.ddtcldpar = ' '
OR b.ddtcldpar = '0'
THEN b.ddtcntund
ELSE 0
END
)
) und1era,
SUM ((CASE
WHEN b.ddtcldpar = '2'
THEN b.ddtcntund
ELSE 0
END)) und2das
FROM ct3t005 b, ct3t004 a
WHERE a.mdaalmcod = 'CTL'
AND a.mddtipdoc = 'NS'
AND a.cdtfchtrn BETWEEN pFechaIni
AND pFechaFin
AND b.ddtcodsec = vCodSec
And a.MdcCcoCod = DECODE(ALLTRIM(vCCsCod),NULL,a.MdcCcoCod, vCCsCod)
And b.DDTTPOPDA = DECODE(ALLTRIM(vTpoPda),NULL,b.DDTTPOPDA,vTpoPda)
AND b.mdaalmcod = a.mdaalmcod
AND b.mddtipdoc = a.mddtipdoc
AND b.cdtnrodoc = a.cdtnrodoc
GROUP BY a.mdaalmcod,
a.mddtipdoc,
a.cdtnrodoc,
a.cdtfchtrn,
a.mdcccocod,
b.ddtcodsec,
b.ddpnropda,
b.ddttpopda,
b.ddtitmcod,
a.cdtrefdoc;
  #2 (permalink)  
Antiguo 22/04/2008, 18:40
Avatar de kikolice  
Fecha de Ingreso: marzo-2004
Mensajes: 1.510
Antigüedad: 20 años, 8 meses
Puntos: 7
Re: Uso de Inner Join

no me puse a analizar toda la sentencia pero por lo de

/*+ INDEX (b SYS_C009606) */

esta obligando a usar el indice, supongo que en la primera consulta oracle no lo esta usando y por eso se tarda mas
__________________
Blogzote.com :-) Mi blog
  #3 (permalink)  
Antiguo 23/04/2008, 08:49
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Re: Uso de Inner Join

Hola,

Si quieres saber como se esta accediendo a las tablas, tienes que ver el plan de ejecucion, te dejo un ejemplo http://www.forosdelweb.com/f100/duda...3/#post2265590

De todos modos, si utilizas el optimizador en CBO, que asumo que si, tienes que actualizar las estadisticas para no tener o al menos reducir la necesidad de utilizar hints, para esto busca informacion sobre el paquete DBMS_STATS

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:29.