I have been wondering how I can improve this Query in Oracle:
SELECT FN_FORMAT_PEROPE(PEROPE) AS PERIODO,
NVL((SELECT COUNT(1) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 1 AND P.PEROPE = R.PEROPE),0) AS NRO_EMITIDOS,
NVL((SELECT SUM(DP.MONTO) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 1 AND P.PEROPE = R.PEROPE),0) AS MONTO_EMITIDO,
NVL((SELECT COUNT(1) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 2 AND P.PEROPE = R.PEROPE),0) AS NRO_ABONADOS,
NVL((SELECT SUM(DP.MONTO) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 2 AND P.PEROPE = R.PEROPE),0) AS MONTO_ABONADO,
NVL((SELECT COUNT(1) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 3 AND P.PEROPE = R.PEROPE),0) AS NRO_RECHAZADOS,
NVL((SELECT SUM(DP.MONTO) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 3 AND P.PEROPE = R.PEROPE),0) AS MONTO_RECHAZADO,
NVL((SELECT COUNT(1) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 4 AND P.PEROPE = R.PEROPE),0) AS NRO_INDEBIDOS,
NVL((SELECT SUM(DP.MONTO) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 4 AND P.PEROPE = R.PEROPE),0) AS MONTO_INDEBIDO,
NVL((SELECT COUNT(1) FROM PG_PAGO P /*INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 5*/ WHERE P.ESTADO = 5 AND P.PEROPE = R.PEROPE),0) AS NRO_RECUPEROS,
NVL((SELECT SUM(DP.MONTO) FROM PG_PAGO P INNER JOIN PG_DETALLE_PAGO DP ON P.IDPAGO = DP.IDPAGO WHERE DP.ESTADO = 5 AND P.PEROPE = R.PEROPE),0) AS MONTO_RECUPERO
FROM PG_RESOLUCIONES R ORDER BY R.PEROPE ASC;
Consider:
- PG_PAGO and PG_DETALLE_PAGO have about 35.000.000 records.
- I use indexes for both tables, but it doesn't work, because this query is too slow.
Thanks for your help.