Jag verkar ha svarat på min egen fråga efter att ha kollat lite mer på nätet:
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)
Använder CROSS APPLY
Jag kan välja grandparent
på översta nivån nod och använd denna för att välja den underordnade parent
noder och så vidare. Med den här metoden har jag tagit min fråga från att köras på cirka 1 minut och 30 sekunder ner till cirka 6 sekunder .
Intressant dock om jag använder den "gamla" OPEN XML
metod för att hämta samma data, körs frågan på 1 sekund !
Det verkar som om du kanske måste närma dig användningen av dessa två tekniker från fall till fall beroende på den förväntade storleken/komplexiteten hos dokumentet som skickas in.