Hola,
yo haría lo siguiente:
1.- Ejecutar la consulta sólo, ya te meterás con el insert luego.
2.- Tomar el tiempo
3.- Cambiar los EXISTS y NOT EXISTS por cláusulas left join o similar. Te supondrá un poco de trabajo pero creo que puede ser más efciente.
4.- Una vez hecho esto, probar a cambiar el orden de las cláusulas de las where, para ver si dependiendo del mismo te utiliza índices o no.
Si no sabes cómo, pregunta.
Ya nos dirás.
Saludos
Código SQL
[-]
INSERT INTO TABLA_A ( RPC_PER_RES, RPC_COD_EST, RPC_COD_BASE, RPC_COD_RES,
RPC_COD_PROD, RPC_COD_POLI, RPC_COD_COBE,
RPC_NUM_HOM, RPC_RES_HOM, RPC_EDAD_HOM,
RPC_OBS_STAT, RPC_COD_LOB, RPC_COD_CHANNEL, RPC_COD_CLASE, RPC_COD_SUN)
SELECT periodo, pEstado, 'COL', 'RK',
decode(a.riesgo_principal,'ca','c', a.riesgo_principal),
poliza, cobertura,
COUNT(distinct GRUPO||IDOPERACION||nvl(NUMEROASEGURADO,0)||nvl(NUMEROCARGA,0)),
sum(nvl(cap_inicuf,0)),
sum(trunc(months_between(last_day(to_date(periodo,'yyyymm')),fechanac)/12))/count(*),
'VALORES A' ,
lineanegocio, canaldeventa, ideerr, CODINTEGRACION
from TABLAGRANDE a, MENSUAL h
where periodo = pPeriodo
AND NVL (aquienafecta, 'x') <> 'P'
AND NVL(aju_afecto,0) = 0
AND NVL(aju_exento,0) = 0
AND EXISTS ( SELECT NULL
FROM temp_polizas iwf
WHERE iwf.lineanegocio != 5
AND iwf.poliza = h.poliza
AND iwf.periodocobro != 'U'
AND RIESGO != 'DG' )
AND NOT EXISTS (SELECT RPC_COD_POLI
FROM TABLA_A
WHERE RPC_PER_RES = pPeriodo
AND RPC_COD_EST = pEstado
AND RPC_COD_BASE = 'COL'
AND RPC_COD_RES = 'RK'
AND RPC_COD_PROD = producto
AND RPC_COD_POLI = to_char(poliza)
AND RPC_COD_COBE = to_char(cobertura) )
AND add_months(h.hasta, nvl(PRIMAMESESDELTA,0)) >= LAST_DAY (TO_DATE (pPeriodo, 'yyyymm'))
AND a.RIESGO = h.RIESGO
group by periodo,
decode(a.riesgo_principal,'ca','c', a.riesgo_principal),
poliza, cobertura,
lineanegocio, canaldeventa, ideerr, CODINTEGRACION ;