puedes intentar con inner joins en lugar de producto cartesiando...a excepcion de la tabla fproest que no le hallo relacion directa con las otras 2... por eso la inclui con un cross join..
Adicional, el tener indices en los campos que hacen los joins seria muy bueno para el performance...
espero te sea de utilidad..
Código:
WITH prueba(padre,hijo) AS
(
SELECT c.padre,
c.hijo
FROM faprcpe a
INNER JOIN faprlpe b
ON a.cp020 = @idProv AND
a.cp000 = 1 AND
a.cp050>'16/12/08' AND
b.lp000 = 1
a.cp010 = b.lp010
CROSS JOIN fproest c
WHERE c.es999 = 1 and
c.padre = @cod
GROUP BY c.padre,
c.hijo
UNION ALL
SELECT c.padre,
c.hijo
FROM faprcpe a
INNER JOIN faprlpe b
ON a.cp020 = @idProv AND
a.cp000 = 1 AND
a.cp050 > '16/12/08' AND
b.lp000 = 1 AND
a.cp010 = b.lp010
CROSS JOIN fproest c
INNER JOIN prueba d
d.hijo = c.padre
WHERE c.es999 = 1
GROUP BY c.padre,
c.hijo
)
SELECT padre,
hijo
FROM prueba
ORDER BY padre,
hijo
Saludos!