Hola:
1. No tenemos vaya ni un diagrama entidad relacion para imaginarnos los indices que tienes o dejas de tener... (OJO NO PONGAS TU DIAGRAMA).
2. La sentencia WITH en Oracle (PL/SQL) esta pensada para almacenar en MEMORIA una consulta recurrente con MUY pocos registros. Cuando se menciona recurrente es porque en el QUERY la usas mas de 1 vez, cuando hablas de pocos registros, imaginaque necesitas una fecha de una tabla, y por algo la tienes que usar mas de 5 o 6 veces en el query, luego esta consulta que devuelve 1 solo registro es la que colocas en el WITH NO toda tu consulta para despues no tener que escribirla. Vaya que no es un medio para escribir menos.
3. Hasta donde puedo ver dentro del WITH usas 2 veces la misma consulta con la diferencia de obtener datos del mes actual y el mismo mes del año anterior. Esto lo podrias obtener en una solo consulta y evitar el UNION ALL que ralentizara SI o SI tu consulta.
Asi de bote pronto es donde puedo ayudar.. si al menos enviaras un EXPLAIN PLAN podria decirte donde mas...
Saludos