Wyszukiwanie rodzica najwyższego poziomu każdego wiersza tabeli [SQL Server 2008]

Mam następujące dwie tabele

Osoba stołowa

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

Hierarchia Relacji Tabeli

ParentId   CHildId
   2         1
   3         2
   4         3

Spowoduje to utworzenie struktury podobnej do drzewa

      D
      |
      C
      |
      B
      |
      A

ParentId i ChildId to klucze obce kolumny Id tabeli osób

Muszę napisać SQL, który może pobrać mnie Rodzicem najwyższego poziomu i-e Root każdej osoby.

Podążanie za CTE może zrobić to dla każdego. Przekształciłem go w funkcję i uruchomiłem dla każdego wiersza osoby. Mam około 3k wierszy w tabeli osób i zajmuje to około 10 sekund. Czy ktoś może zaproponować podejście, które może zająć mniej. Problem polega na tym, że funkcja działająca po CTE działa 3k razy

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

questionAnswers(3)

yourAnswerToTheQuestion