Búsqueda del nivel superior principal de cada fila de una tabla [SQL Server 2008]

Tengo dos tablas siguientes

Persona de la mesa

Id   Name
   1    A
   2    B
   3    C
   4    D
   5    E

Tabla de relación de jerarquía

ParentId   CHildId
   2         1
   3         2
   4         3

Esto formará una estructura similar a un árbol.

      D
      |
      C
      |
      B
      |
      A

ParentId y ChildId son claves foráneas de la columna Id de la tabla de personas

Necesito escribir SQL que pueda traerme la raíz i-e principal de nivel superior de cada persona.

Siguiendo CTE puede hacer esto para cada uno. Lo convertí en una función y lo ejecuté para cada fila de persona. Tengo alrededor de 3k filas en la tabla de Persona y toma aproximadamente 10 Segundos para hacer eso. ¿Alguien puede sugerir un enfoque que puede tomar menos. El problema es la función que se ejecuta después de ejecutar CTE 3k veces

DECLARE @childID INT 
SET @childID  = 1 --chield to search

;WITH RCTE AS
(
SELECT *, 1 AS Lvl FROM RelationHierarchy 
WHERE ChildID = @childID

UNION ALL

SELECT rh.*, Lvl+1 AS Lvl FROM dbo.RelationHierarchy rh
INNER JOIN RCTE rc ON rh.CHildId = rc.ParentId
 )
SELECT TOP 1 id, Name
FROM RCTE r
inner JOIN dbo.Person p ON p.id = r.ParentId
ORDER BY lvl DESC

Respuestas a la pregunta(3)

Su respuesta a la pregunta