Изглежда, че отговорих на собствения си въпрос след малко повече разглеждане онлайн:
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)
Използване на CROSS APPLY
Мога да избера grandparent
от най-високо ниво възел и използвайте това, за да изберете дъщерния parent
възли и така нататък. Използвайки този метод, спрях изпълнението на заявката си за около 1 минута и 30 секунди до около 6 секунди .
Интересно е обаче, че ако използвам "стария" OPEN XML
метод за извличане на същите данни, заявката се изпълнява за 1 секунда !
Изглежда, че може да се наложи да подходите към използването на тези две техники за всеки отделен случай в зависимост от очаквания размер/сложност на документа, който се предава.