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

OPTIMIZAR SELECT ORACLE 10g

Estas en el tema de OPTIMIZAR SELECT ORACLE 10g en el foro de Oracle en Foros del Web. Esta consulta esta tardando de 4 a 10 hrs mas de lo normal y ya he probado varios Hints y no me han ayudado en ...
  #1 (permalink)  
Antiguo 13/06/2011, 10:19
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Exclamación OPTIMIZAR SELECT ORACLE 10g

Esta consulta esta tardando de 4 a 10 hrs mas de lo normal y ya he probado varios Hints y no me han ayudado en Nada. no logro hubicar cual es la parte que hace que se vuelva Pesada. Alguien me podria apoyar la Base es de ORACLE 10G
Cualquier sugerencia es buena.
Soy nuevo en el Foro y prometo estar activo y apollando.

SELECT /*+ USE_HASH(ACT, AD) */
RPAD('-000000001',10,' ')||
RPAD(' ',10,' ')||
RPAD(AD.COD_BONO,10,' ')||
CASE WHEN TRUNC(SYSDATE-1) > TRUNC(AD.FEC_CADUCA) THEN 'CAD'
WHEN AD.SEC_BAJA IS NOT NULL AND AD.SEC_ACTUACION IN (SELECT AC.SEC_ACTANUL FROM PPGA_ACTABOPRE AC WHERE AC.COD_ACTUACIO='AB') THEN 'ANU'
WHEN AD.SEC_BAJA IS NOT NULL AND AD.NUM_TELEFONO IN (SELECT AC.NUM_TELEFONO FROM PPGA_ACTABOPRE AC WHERE AC.COD_ACTUACIO='BB') THEN 'BBE'
WHEN BP.COD_ESTADO = 'V' THEN 'CON'
ELSE
'VIG' END ||
RPAD('NA',10,' ')||
RPAD(ACT.COD_USUARIO,30,' ') ||
CASE WHEN AD.COD_PROMO IS NULL THEN 'NI '
WHEN AD.COD_PROMO IN (SELECT PR.COD_PROMOCION FROM PROMO.PPGA_PROMOCIONES PR) THEN RPAD(AD.COD_PROMO,32,' ')
ELSE RPAD('B_'||AD.COD_PROMO,32,' ') END ||
'AA '||
' '||
'0000000001'||--LPAD(COUNT(*), 10, '0')||
RPAD(AD.NUM_TELEFONO ,15, ' ')||
'NI '||
CASE WHEN TBN.COD_MODBONO = 'MI' THEN TO_CHAR(AD.CAN_BONIFICA/60,'S099999999.9990') ELSE TO_CHAR(AD.CAN_BONIFICA,'S099999999.9990') END||
' '||
' '||
' '||
TO_CHAR(ACT.IMP_COSTE/1000,'S099999999.9990')||
RPAD(NVL(TO_CHAR(ACT.FEC_MODIFICA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_INSTALAC, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_ALTA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_CADUCA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
' '||
' '||
' '||
' '||
RPAD(ABO.COD_ESTAPREP,18, ' ')||
RPAD(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'),14,' ')
FROM PPGA_ACTABOPRE ACT, PPGA_ADQUISICIONES AD, PPGA_ABOPREPCOM ABO, PPGA_BONOS BO, PPGA_BONOPRE BP, PPGA_TIPBONO TBN
WHERE ACT.COD_ACTUACIO='AB'
AND ACT.COD_ESTAREC='EJ'
AND ACT.SEC_ACTUACION = AD.SEC_ACTUACION
AND ABO.FEC_ACTIVA < TRUNC(SYSDATE)
AND NVL(AD.FEC_CADUCA,trunc(SYSDATE)) >= TRUNC(sysdate)-2
AND AD.NUM_TELEFONO = BP.NUM_TELEFONO
AND AD.NUM_TELEFONO = ABO.NUM_TELEFONO
AND AD.COD_BONO = BO.COD_BONO
AND BO.TIP_BONO = BP.TIP_BONO
AND BO.TIP_BONO = TBN.TIP_BONO
AND ABO.COD_ESTAPREP IN ('X','T','W','L','V','A')
UNION ALL
SELECT /*+ FULL(BP) INDEX(ABO, PK_ABOPREPCOM) FULL(TBN) */
RPAD('-000000001',10,' ')||
RPAD(' ',10,' ')||
RPAD(BP.TIP_BONO,10,' ')||
'CON' ||
RPAD('NA',10,' ')||
RPAD(NVL(TBN.COD_USUARIO,' '),30,' ')||
'NI '||
'AA '||
' '||
'0000000001'||
RPAD(BP.NUM_TELEFONO,15,' ')||
'NI '||
' '||--- Se elimina por que es a nivel de bono NUM_UNIDADES_INICIALES_BENEFICIO
' '||
' '||
' '||
' '||--- Se elimina por que es a nivel de bono. IMP_COSTO_BENEFICIO
RPAD(NVL(TO_CHAR(BP.FEC_ESTABONO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_INICIO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_INICIO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_CADUCA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
' '||
' '||
' '||
' '||
RPAD(ABO.COD_ESTAPREP,18, ' ')||
RPAD(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'),14,' ')
FROM PPGA_BONOPRE BP, PPGA_ABOPREPCOM ABO, PPGA_TIPBONO TBN
WHERE BP.NUM_TELEFONO=ABO.NUM_TELEFONO
AND BP.COD_PARTICION = ABO.COD_PARTICION
AND BP.TIP_BONO = TBN.TIP_BONO
and BP.fec_estabono >= TRUNC(SYSDATE-1)
and BP.fec_estabono < TRUNC(SYSDATE)
and BP.COD_ESTADO='V'
AND ABO.COD_ESTAPREP IN ('X','T','W','L','V','A')
AND ABO.FEC_ACTIVA < TRUNC(SYSDATE) ;
  #2 (permalink)  
Antiguo 14/06/2011, 08:55
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Hola rcastaneda:

Primero, comienza por cambiar la forma en que estás haciendo la unión en tus tablas para utilizar INNER JOIN en lugar de hacer las uniones en el WHERE es decir:

En lugar de hacer esto:

Código:
FROM Tabla1, Tabla2 WHERE Tabla1.Campo1 = Tabla2.Campo1
Utiliza esto:

Código:
FROM Tabla1 INNER JOIN Tabla2 
ON Tabla1.Campo1 = Tabla2.Campo1
Segundo, veo que utilizas muchas veces condiciones IN, este tipo de filtros son de los menos eficientes, dado que tienen que analizar el total de la tabla para poder validarse. Habría que revisar si puedes incluir también estos filtros como un INNER JOIN o en su defecto utilizar EXISTS en lugar de IN.

Revisa que todas tus tablas tengan definidas sus llaves, FK e índices.

Saludos
Leo.
  #3 (permalink)  
Antiguo 21/06/2011, 13:51
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Los hints son cada vez menos necesarios, antes de utilizarlos asegúrate de tener el entorno en condiciones, por ejemplo:

1. Estadísticas actualizadas para la toma de decisiones del optimizador, para esto debes buscar información sobre el paquete dbms_stats.
2. Plan de ejecución, es la primera herramienta que se debe utilizar para saber cómo se está accediendo a los datos y en caso de que sea necesario, que índices faltan, para esto puedes buscar información sobre el comando explain plan.
3. Dimensionamiento de memoria, dependiendo del volumen de datos que gestiones, deberás dimensionar la memoria, busca sobre cómo configurar la SGA y PGA.

También es muy importante tener un modelo de datos normalizado, en general es el punto de partida para una optimización.

Saludos
  #4 (permalink)  
Antiguo 23/06/2011, 17:26
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Hola tomare muy encuenta respecto a esos where gracias ... aplique un hint en el segundo select despues del union all
SELECT /* FULL(BP) INDEX(ABO, PK_ABOPREPCOM) FULL(TBN) */
  #5 (permalink)  
Antiguo 23/06/2011, 17:26
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Mi nuevo plan de ejecucion quedo asi.

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1296477202

------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop | TQ |IN-OUT| PQ Distrib |
------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 198K| 29M| | 2907K (19)| 08:52:58 | | | | | |
| 1 | UNION-ALL | | | | | | | | | | | |
| 2 | PX COORDINATOR | | | | | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10008 | 198K| 29M| | 2521K (6)| 07:42:16 | | | Q1,08 | P->S | QC (RAND) |
|* 4 | HASH JOIN BUFFERED | | 198K| 29M| | 2521K (6)| 07:42:16 | | | Q1,08 | PCWP | |
| 5 | PX RECEIVE | | 198K| 25M| | 2509K (6)| 07:40:06 | | | Q1,08 | PCWP | |
| 6 | PX SEND HASH | :TQ10006 | 198K| 25M| | 2509K (6)| 07:40:06 | | | Q1,06 | P->P | HASH |
|* 7 | HASH JOIN | | 198K| 25M| | 2509K (6)| 07:40:06 | | | Q1,06 | PCWP | |
| 8 | BUFFER SORT | | | | | | | | | Q1,06 | PCWC | |
| 9 | PX RECEIVE | | 419 | 3352 | | 3 (0)| 00:00:01 | | | Q1,06 | PCWP | |
| 10 | PX SEND BROADCAST | :TQ10001 | 419 | 3352 | | 3 (0)| 00:00:01 | | | | S->P | BROADCAST |
| 11 | TABLE ACCESS FULL | PPGA_TIPBONO | 419 | 3352 | | 3 (0)| 00:00:01 | | | | | |
|* 12 | HASH JOIN | | 198K| 24M| | 2509K (6)| 07:40:06 | | | Q1,06 | PCWP | |
| 13 | BUFFER SORT | | | | | | | | | Q1,06 | PCWC | |
| 14 | PX RECEIVE | | 1716 | 24024 | | 4 (0)| 00:00:01 | | | Q1,06 | PCWP | |
| 15 | PX SEND BROADCAST | :TQ10002 | 1716 | 24024 | | 4 (0)| 00:00:01 | | | | S->P | BROADCAST |
| 16 | TABLE ACCESS FULL | PPGA_BONOS | 1716 | 24024 | | 4 (0)| 00:00:01 | | | | | |
|* 17 | HASH JOIN | | 68M| 7351M| 76M| 2509K (6)| 07:40:04 | | | Q1,06 | PCWP | |
| 18 | PX RECEIVE | | 5990K| 542M| | 2084K (7)| 06:22:14 | | | Q1,06 | PCWP | |
| 19 | PX SEND HASH | :TQ10005 | 5990K| 542M| | 2084K (7)| 06:22:14 | | | Q1,05 | P->P | HASH |
|* 20 | HASH JOIN | | 5990K| 542M| 29M| 2084K (7)| 06:22:14 | | | Q1,05 | PCWP | |
| 21 | PX RECEIVE | | 5990K| 165M| | 945K (2)| 02:53:24 | | | Q1,05 | PCWP | |
| 22 | PX SEND HASH | :TQ10004 | 5990K| 165M| | 945K (2)| 02:53:24 | | | Q1,04 | P->P | HASH |
| 23 | PX BLOCK ITERATOR | | 5990K| 165M| | 945K (2)| 02:53:24 | 1 | 20 | Q1,04 | PCWC | |
|* 24 | TABLE ACCESS FULL | PPGA_ACTABOPRE | 5990K| 165M| | 945K (2)| 02:53:24 | 1 | 20 | Q1,04 | PCWP | |
| 25 | BUFFER SORT | | | | | | | | | Q1,05 | PCWC | |
| 26 | PX RECEIVE | | 19M| 1223M| | 1127K (10)| 03:26:45 | | | Q1,05 | PCWP | |
| 27 | PX SEND HASH | :TQ10000 | 19M| 1223M| | 1127K (10)| 03:26:45 | | | | S->P | HASH |
| 28 | PARTITION LIST ALL | | 19M| 1223M| | 1127K (10)| 03:26:45 | 1 | 20 | | | |
|* 29 | TABLE ACCESS FULL | PPGA_ADQUISICIONES | 19M| 1223M| | 1127K (10)| 03:26:45 | 1 | 20 | | | |
| 30 | BUFFER SORT | | | | | | | | | Q1,06 | PCWC | |
| 31 | PX RECEIVE | | 228M| 3921M| | 375K (3)| 01:08:50 | | | Q1,06 | PCWP | |
| 32 | PX SEND HASH | :TQ10003 | 228M| 3921M| | 375K (3)| 01:08:50 | | | | S->P | HASH |
| 33 | PARTITION LIST ALL | | 228M| 3921M| | 375K (3)| 01:08:50 | 1 | 20 | | | |
| 34 | TABLE ACCESS FULL | PPGA_BONOPRE | 228M| 3921M| | 375K (3)| 01:08:50 | 1 | 20 | | | |
| 35 | PX RECEIVE | | 23M| 469M| | 11799 (9)| 00:02:10 | | | Q1,08 | PCWP | |
| 36 | PX SEND HASH | :TQ10007 | 23M| 469M| | 11799 (9)| 00:02:10 | | | Q1,07 | P->P | HASH |
| 37 | PX BLOCK ITERATOR | | 23M| 469M| | 11799 (9)| 00:02:10 | 1 | 20 | Q1,07 | PCWC | |
|* 38 | TABLE ACCESS FULL | PPGA_ABOPREPCOM | 23M| 469M| | 11799 (9)| 00:02:10 | 1 | 20 | Q1,07 | PCWP | |
|* 39 | FILTER | | | | | | | | | | | |
| 40 | NESTED LOOPS | | 19 | 1482 | | 385K (6)| 01:10:43 | | | | | |
| 41 | NESTED LOOPS | | 19 | 1292 | | 385K (6)| 01:10:43 | | | | | |
| 42 | PARTITION LIST ALL | | 22 | 968 | | 385K (6)| 01:10:42 | 1 | 20 | | | |
|* 43 | TABLE ACCESS FULL | PPGA_BONOPRE | 22 | 968 | | 385K (6)| 01:10:42 | 1 | 20 | | | |
| 44 | PARTITION LIST ITERATOR | | 1 | 24 | | 2 (0)| 00:00:01 | KEY | KEY | | | |
|* 45 | TABLE ACCESS BY LOCAL INDEX ROWID| PPGA_ABOPREPCOM | 1 | 24 | | 2 (0)| 00:00:01 | KEY | KEY | | | |
|* 46 | INDEX UNIQUE SCAN | PK_ABOPREPCOM | 1 | | | 1 (0)| 00:00:01 | KEY | KEY | | | |
| 47 | TABLE ACCESS BY INDEX ROWID | PPGA_TIPBONO | 1 | 10 | | 1 (0)| 00:00:01 | | | | | |
|* 48 | INDEX UNIQUE SCAN | PK_PPGA_TIPBONO | 1 | | | 0 (0)| 00:00:01 | | | | | |
------------------------------------------------------------------------------------------------------------------------------------------------------------------
  #6 (permalink)  
Antiguo 23/06/2011, 17:27
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Predicate Information (identified by operation id):
---------------------------------------------------

4 - access("AD"."NUM_TELEFONO"="ABO"."NUM_TELEFONO")
7 - access("BO"."TIP_BONO"="TBN"."TIP_BONO")
12 - access("AD"."COD_BONO"="BO"."COD_BONO" AND "BO"."TIP_BONO"="BP"."TIP_BONO")
17 - access("AD"."NUM_TELEFONO"="BP"."NUM_TELEFONO")
20 - access("ACT"."SEC_ACTUACION"="AD"."SEC_ACTUACION")
24 - filter("ACT"."COD_ACTUACIO"='AB' AND "ACT"."COD_ESTAREC"='EJ')
29 - filter(NVL("AD"."FEC_CADUCA",TRUNC(SYSDATE@!))>=TR UNC(SYSDATE@!)-2)
38 - filter(("ABO"."COD_ESTAPREP"='A' OR "ABO"."COD_ESTAPREP"='L' OR "ABO"."COD_ESTAPREP"='T' OR "ABO"."COD_ESTAPREP"='V' OR "ABO"."COD_ESTAPREP"='W'
OR "ABO"."COD_ESTAPREP"='X') AND "ABO"."FEC_ACTIVA"<TRUNC(SYSDATE@!))
39 - filter(TRUNC(SYSDATE@!-1)<TRUNC(SYSDATE@!))
43 - filter("BP"."COD_ESTADO"='V' AND "BP"."FEC_ESTABONO">=TRUNC(SYSDATE@!-1) AND "BP"."FEC_ESTABONO"<TRUNC(SYSDATE@!))
45 - filter(("ABO"."COD_ESTAPREP"='A' OR "ABO"."COD_ESTAPREP"='L' OR "ABO"."COD_ESTAPREP"='T' OR "ABO"."COD_ESTAPREP"='V' OR "ABO"."COD_ESTAPREP"='W'
OR "ABO"."COD_ESTAPREP"='X') AND "ABO"."FEC_ACTIVA"<TRUNC(SYSDATE@!))
46 - access("BP"."NUM_TELEFONO"="ABO"."NUM_TELEFONO" AND "BP"."COD_PARTICION"="ABO"."COD_PARTICION")
48 - access("BP"."TIP_BONO"="TBN"."TIP_BONO")

74 rows selected.
  #7 (permalink)  
Antiguo 23/06/2011, 17:28
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

antes mi Plan hash value era = a 1747210662 ahora Plan hash value: 1296477202

aplicare las mejores que me comentan haber si lo logro bajar

Muchas gracias. de antemano
  #8 (permalink)  
Antiguo 28/06/2011, 20:00
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Hay algunas consideraciones que puedes evaluar:

1. El valor de Plan Hash Value es solo un identificador numérico para el plan de ejecución, es la forma fácil de saber si dos planes son iguales.

2. Por lo que se puede ver del plan de ejecución, la tabla PPGA_BONOPRE es grande y se accede a los datos con la operación full scan, aún cuando el filtro sobre la columna fec_estabono es de dos días, un índice sobre este campo puede ser útil.

3. Como te decía, en la medida que van mejorando el optimizador, los hints son menos necesarios, para evaluar una consulta el orden de tareas puede ser:

3.1 Actualizar las estadísticas, por ejemplo, para el esquema propietario de las tablas

Código:
begin
dbms_stats.gather_schema_stats('NOMBRE_ESQUEMA');
end;
/
3.2 Una vez actualizada las estadísticas, evaluar el plan de ejecución (sin hints) buscando pistas sobre posibles índices. En caso de que crees alguno, vuelve a ejecutar el paso anterior para que el optimizador los tenga en cuenta y de nuevo el plan de ejecución para ver las diferencias.

3.3 Finalmente, si después de los cambios y ajustes de memoria no ves mejoras, puedes recurrir a los hints.

Saludos
  #9 (permalink)  
Antiguo 12/07/2011, 08:31
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Hola!

Muchas gracias por tus recomendaciones, considerare bastante lo referente a el orden de tareas.
hasta el momento he utilizado unos hints que me han servido mucho. estoy probando todavia los publicare en cuanto termine mis pruebas y el nuevo plan de ejecucion.

Gracias por la valiosa colaboracion
  #10 (permalink)  
Antiguo 25/07/2011, 10:24
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Exclamación Respuesta: OPTIMIZAR SELECT ORACLE 10g

Hola Matanga espero me puedas apoyar..... realice unas modificaciones a la consulta y las han probado y me alegan que no se esta paralelisando no se como leer esto en el plan de ejecución si tal ves me pudieras apollar donde ellos pueden identificar que no toma paralelismo la consulta... te muesto como ha quedado mi consulta final.
y en otro mensage te pongo mi nuevo plan de ejecucion.

Ahora no se si exista algún manual o algo asi que conozcas respecto al plan de ejecución ya que me esta costando mucho trabajo investigar y entenderlo

Saludos..
-------------------------------------------------

SELECT /*+ full (ACT) full (ABO) USE_HASH(ACT, ABO) parallel ( ABO 12 ) parallel ( ACT 12 ) */
RPAD('-000000001',10,' ')||
RPAD(' ',10,' ')||
RPAD(AD.COD_BONO,10,' ')||
CASE WHEN TRUNC(SYSDATE-1) > TRUNC(AD.FEC_CADUCA) THEN 'CAD'
WHEN AD.SEC_BAJA IS NOT NULL AND AD.SEC_ACTUACION IN (SELECT /*+ index ( ac PPGA_ACTABOPRE_I02 ) */ AC.SEC_ACTANUL FROM PPGA_ACTABOPRE AC WHERE AC.COD_ACTUACIO='AB') THEN 'ANU'
WHEN AD.SEC_BAJA IS NOT NULL AND AD.NUM_TELEFONO IN (SELECT /*+ index ( ac PPGA_ACTABOPRE_I02 ) */ AC.NUM_TELEFONO FROM PPGA_ACTABOPRE AC WHERE AC.COD_ACTUACIO='BB') THEN 'BBE'
WHEN BP.COD_ESTADO = 'V' THEN 'CON'
ELSE
'VIG' END ||
RPAD('NA',10,' ')||
RPAD(ACT.COD_USUARIO,30,' ') ||
CASE WHEN AD.COD_PROMO IS NULL THEN 'NI '
WHEN AD.COD_PROMO IN (SELECT /*+ index ( PR PK_PROMOCIONES ) */ PR.COD_PROMOCION FROM PROMO.PPGA_PROMOCIONES PR) THEN RPAD(AD.COD_PROMO,32,' ')
ELSE RPAD('B_'||AD.COD_PROMO,32,' ') END ||
'AA '||
' '||
'0000000001'||--LPAD(COUNT(*), 10, '0')||
RPAD(AD.NUM_TELEFONO ,15, ' ')||
'NI '||
CASE WHEN TBN.COD_MODBONO = 'MI' THEN TO_CHAR(AD.CAN_BONIFICA/60,'S099999999.9990') ELSE TO_CHAR(AD.CAN_BONIFICA,'S099999999.9990') END||
' '||
' '||
' '||
TO_CHAR(ACT.IMP_COSTE/1000,'S099999999.9990')||
RPAD(NVL(TO_CHAR(ACT.FEC_MODIFICA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_INSTALAC, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_ALTA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(AD.FEC_CADUCA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
' '||
' '||
' '||
' '||
RPAD(ABO.COD_ESTAPREP,18, ' ')||
RPAD(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'),14,' ')
FROM PPGA_ACTABOPRE ACT, PPGA_ADQUISICIONES AD, PPGA_ABOPREPCOM ABO, PPGA_BONOS BO, PPGA_BONOPRE BP, PPGA_TIPBONO TBN
WHERE ACT.COD_ACTUACIO='AB'
AND ACT.COD_ESTAREC='EJ'
AND ACT.SEC_ACTUACION = AD.SEC_ACTUACION
AND ABO.FEC_ACTIVA < TRUNC(SYSDATE)
AND NVL(AD.FEC_CADUCA,trunc(SYSDATE)) >= TRUNC(sysdate)-2
AND AD.NUM_TELEFONO = BP.NUM_TELEFONO
AND AD.NUM_TELEFONO = ABO.NUM_TELEFONO
AND AD.COD_BONO = BO.COD_BONO
AND BO.TIP_BONO = BP.TIP_BONO
AND BO.TIP_BONO = TBN.TIP_BONO
AND ABO.COD_ESTAPREP IN ('X','T','W','L','V','A')
UNION ALL
SELECT /*+ FULL(BP) FULL(TBN) use_hash ( BP abo ) parallel ( abo 12 ) parallel ( bp 12 )*/
RPAD('-000000001',10,' ')||
RPAD(' ',10,' ')||
RPAD(BP.TIP_BONO,10,' ')||
'CON' ||
RPAD('NA',10,' ')||
RPAD(NVL(TBN.COD_USUARIO,' '),30,' ')||
'NI '||
'AA '||
' '||
'0000000001'||
RPAD(BP.NUM_TELEFONO,15,' ')||
'NI '||
' '||--- Se elimina por que es a nivel de bono NUM_UNIDADES_INICIALES_BENEFICIO
' '||
' '||
' '||
' '||--- Se elimina por que es a nivel de bono. IMP_COSTO_BENEFICIO
RPAD(NVL(TO_CHAR(BP.FEC_ESTABONO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_INICIO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_INICIO, 'YYYYMMDDHH24MISS'),' '),14,' ')||
RPAD(NVL(TO_CHAR(BP.FEC_CADUCA, 'YYYYMMDDHH24MISS'),' '),14,' ')||
' '||
' '||
' '||
' '||
RPAD(ABO.COD_ESTAPREP,18, ' ')||
RPAD(TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS'),14,' ')
FROM PPGA_BONOPRE BP, PPGA_ABOPREPCOM ABO, PPGA_TIPBONO TBN
WHERE BP.NUM_TELEFONO=ABO.NUM_TELEFONO
AND BP.COD_PARTICION = ABO.COD_PARTICION
AND BP.TIP_BONO = TBN.TIP_BONO
and BP.fec_estabono >= TRUNC(SYSDATE-1)
and BP.fec_estabono < TRUNC(SYSDATE)
and BP.COD_ESTADO='V'
AND ABO.COD_ESTAPREP IN ('X','T','W','L','V','A')
AND ABO.FEC_ACTIVA < TRUNC(SYSDATE)
;
  #11 (permalink)  
Antiguo 25/07/2011, 10:27
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

----------PLAN DE EJECUCION


Plan
SELECT STATEMENT CHOOSECost: 2.309.132 Bytes: 44.178.108 Cardinality: 283.202
54 PX COORDINATOR
53 PX SEND QC (RANDOM) PARALLEL_TO_SERIAL SYS.:TQ10011 :Q1011
52 BUFFER SORT PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 2.309.132 Bytes: 44.178.108 Cardinality: 283.202
51 UNION-ALL PARALLEL_COMBINED_WITH_PARENT :Q1011
35 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 2.264.717 Bytes: 44.176.704 Cardinality: 283.184
30 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 2.256.817 Bytes: 38.229.840 Cardinality: 283.184
29 PX SEND HASH PARALLEL_TO_PARALLEL SYS.:TQ10008 :Q1008Cost: 2.256.817 Bytes: 38.229.840 Cardinality: 283.184
28 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 2.256.817 Bytes: 38.229.840 Cardinality: 283.184
4 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1008
3 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 3 Bytes: 3.352 Cardinality: 419
2 PX SEND BROADCAST PARALLEL_FROM_SERIAL SYS.:TQ10001 Cost: 3 Bytes: 3.352 Cardinality: 419
1 TABLE ACCESS FULL TABLE PPGA.PPGA_TIPBONO Cost: 3 Bytes: 3.352 Cardinality: 419
27 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 2.256.814 Bytes: 35.964.368 Cardinality: 283.184
8 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1008
7 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 4 Bytes: 25.536 Cardinality: 1.824
6 PX SEND BROADCAST PARALLEL_FROM_SERIAL SYS.:TQ10002 Cost: 4 Bytes: 25.536 Cardinality: 1.824
5 TABLE ACCESS FULL TABLE PPGA.PPGA_BONOS Cost: 4 Bytes: 25.536 Cardinality: 1.824
26 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 2.256.685 Bytes: 11.231.926.088 Cardinality: 99.397.576
20 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 1.835.966 Bytes: 787.930.380 Cardinality: 8.294.004
19 PX SEND HASH PARALLEL_TO_PARALLEL SYS.:TQ10006 :Q1006Cost: 1.835.966 Bytes: 787.930.380 Cardinality: 8.294.004
18 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1006Cost: 1.835.966 Bytes: 787.930.380 Cardinality: 8.294.004
12 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1006Cost: 653.239 Bytes: 240.526.116 Cardinality: 8.294.004
11 PX SEND HASH PARALLEL_TO_PARALLEL SYS.:TQ10005 :Q1005Cost: 653.239 Bytes: 240.526.116 Cardinality: 8.294.004
10 PX BLOCK ITERATOR PARALLEL_COMBINED_WITH_CHILD :Q1005Cost: 653.239 Bytes: 240.526.116 Cardinality: 8.294.004 Partition #: 24 Partitions accessed #1 - #20
9 TABLE ACCESS FULL TABLE PARALLEL_COMBINED_WITH_PARENT PPGA.PPGA_ACTABOPRE :Q1005Cost: 653.239 Bytes: 240.526.116 Cardinality: 8.294.004 Partition #: 24 Partitions accessed #1 - #20
17 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1006
16 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1006Cost: 1.174.106 Bytes: 1.397.846.010 Cardinality: 21.179.485
15 PX SEND HASH PARALLEL_FROM_SERIAL SYS.:TQ10000 Cost: 1.174.106 Bytes: 1.397.846.010 Cardinality: 21.179.485
14 PARTITION LIST ALL Cost: 1.174.106 Bytes: 1.397.846.010 Cardinality: 21.179.485 Partition #: 29 Partitions accessed #1 - #20
13 TABLE ACCESS FULL TABLE PPGA.PPGA_ADQUISICIONES Cost: 1.174.106 Bytes: 1.397.846.010 Cardinality: 21.179.485 Partition #: 29 Partitions accessed #1 - #20
25 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1008
24 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1008Cost: 386.729 Bytes: 4.136.023.926 Cardinality: 229.779.107
23 PX SEND HASH PARALLEL_FROM_SERIAL SYS.:TQ10003 Cost: 386.729 Bytes: 4.136.023.926 Cardinality: 229.779.107
22 PARTITION LIST ALL Cost: 386.729 Bytes: 4.136.023.926 Cardinality: 229.779.107 Partition #: 34 Partitions accessed #1 - #20
21 TABLE ACCESS FULL TABLE PPGA.PPGA_BONOPRE Cost: 386.729 Bytes: 4.136.023.926 Cardinality: 229.779.107 Partition #: 34 Partitions accessed #1 - #20
34 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 7.869 Bytes: 494.031.825 Cardinality: 23.525.325
33 PX SEND HASH PARALLEL_TO_PARALLEL SYS.:TQ10009 :Q1009Cost: 7.869 Bytes: 494.031.825 Cardinality: 23.525.325
32 PX BLOCK ITERATOR PARALLEL_COMBINED_WITH_CHILD :Q1009Cost: 7.869 Bytes: 494.031.825 Cardinality: 23.525.325 Partition #: 38 Partitions accessed #1 - #20
31 TABLE ACCESS FULL TABLE PARALLEL_COMBINED_WITH_PARENT PPGA.PPGA_ABOPREPCOM :Q1009Cost: 7.869 Bytes: 494.031.825 Cardinality: 23.525.325 Partition #: 38 Partitions accessed #1 - #20
50 FILTER PARALLEL_COMBINED_WITH_CHILD :Q1011
49 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 44.416 Bytes: 1.404 Cardinality: 18
46 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1011Cost: 36.438 Bytes: 1.134 Cardinality: 21
45 PX SEND BROADCAST LOCAL PARALLEL_TO_PARALLEL SYS.:TQ10010 :Q1010Cost: 36.438 Bytes: 1.134 Cardinality: 21
44 HASH JOIN PARALLEL_COMBINED_WITH_PARENT :Q1010Cost: 36.438 Bytes: 1.134 Cardinality: 21
39 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1010Cost: 36.435 Bytes: 924 Cardinality: 21
38 PX SEND HASH PARALLEL_TO_PARALLEL SYS.:TQ10007 :Q1007Cost: 36.435 Bytes: 924 Cardinality: 21
37 PX BLOCK ITERATOR PARALLEL_COMBINED_WITH_CHILD :Q1007Cost: 36.435 Bytes: 924 Cardinality: 21 Partition #: 47 Partitions accessed #1 - #20
36 TABLE ACCESS FULL TABLE PARALLEL_COMBINED_WITH_PARENT PPGA.PPGA_BONOPRE :Q1007Cost: 36.435 Bytes: 924 Cardinality: 21 Partition #: 47 Partitions accessed #1 - #20
43 BUFFER SORT PARALLEL_COMBINED_WITH_CHILD :Q1010
42 PX RECEIVE PARALLEL_COMBINED_WITH_PARENT :Q1010Cost: 3 Bytes: 4.190 Cardinality: 419
41 PX SEND HASH PARALLEL_FROM_SERIAL SYS.:TQ10004 Cost: 3 Bytes: 4.190 Cardinality: 419
40 TABLE ACCESS FULL TABLE PPGA.PPGA_TIPBONO Cost: 3 Bytes: 4.190 Cardinality: 419
48 PX BLOCK ITERATOR PARALLEL_COMBINED_WITH_CHILD :Q1011Cost: 7.947 Bytes: 564.607.800 Cardinality: 23.525.325 Partition #: 53 Partitions accessed #1 - #20
47 TABLE ACCESS FULL TABLE PARALLEL_COMBINED_WITH_PARENT PPGA.PPGA_ABOPREPCOM :Q1011Cost: 7.947 Bytes: 564.607.800 Cardinality: 23.525.325 Partition #: 53 Partitions accessed #1 - #20
  #12 (permalink)  
Antiguo 25/07/2011, 10:28
 
Fecha de Ingreso: junio-2011
Mensajes: 16
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: OPTIMIZAR SELECT ORACLE 10g

como saber en el plan de ejecucion que si levanta paralelismo???
  #13 (permalink)  
Antiguo 29/07/2011, 18:02
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Respuesta: OPTIMIZAR SELECT ORACLE 10g

Un ejemplo, si tienes un SELECT sobre una tabla que está configurada con un grado de paralelismo 4, verás 5 procesos, cuatro para recorrer los datos en paralelo (PX SEND y PX RECEIVE) y un quinto que coordina la unión de las 4 porciones de datos (PX COORDINATOR).

No dices si la base de datos están en Windows o Unix/Linux, por una limitación del sistema operativo, en Windows solo verás un único proceso llamado oracle.exe que resuelve todo a nivel de thread, diferente es en Unix/Linux, donde todo se resuelve a nivel de proceso, y los px los puedes ver con el nombre de ora_p000_prodsid, ora_p001_prodsid, etc.

Saludos

Etiquetas: 10g, select
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:20.