Wydaje mi się, że po dłuższym rozglądaniu się w Internecie odpowiedziałem na własne pytanie:
SELECT
grandparent.gname.value('@name', 'VARCHAR(15)'),
parent.pname.value('@name', 'VARCHAR(15)'),
child.cname.value('@name', 'VARCHAR(15)')
FROM
@xmlFamilyTree.nodes('/grandparent') AS grandparent(gname)
CROSS APPLY
grandparent.gname.nodes('*') AS parent(pname)
CROSS APPLY
parent.pname.nodes('children/*') AS child(cname)
Korzystanie z CROSS APPLY
Mogę wybrać grandparent
najwyższego poziomu węzła i użyj go, aby wybrać potomnego parent
węzły i tak dalej. Korzystając z tej metody, wykonałem moje zapytanie w około 1 minutę 30 sekund do około 6 sekund .
Co ciekawe, jeśli użyję "starego" OPEN XML
metoda pobierania tych samych danych, zapytanie jest wykonywane w 1 sekundę !
Wygląda na to, że być może będziesz musiał podejść do tych dwóch technik indywidualnie, w zależności od oczekiwanego rozmiaru/złożoności przekazywanego dokumentu.