Mi sembra di aver risposto alla mia stessa domanda dopo aver guardato un po' più in giro online:
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)
Utilizzando CROSS APPLY
Posso selezionare il grandparent
di livello superiore nodo e usalo per selezionare il figlio parent
nodi e così via. Utilizzando questo metodo ho impedito l'esecuzione della mia query in circa 1 minuto e 30 secondi fino a circa 6 secondi .
È interessante notare però che se utilizzo il "vecchio" OPEN XML
metodo per recuperare gli stessi dati, la query viene eseguita in 1 secondo !
Sembra che potresti dover affrontare l'uso di queste due tecniche caso per caso, a seconda delle dimensioni/complessità previste del documento che viene passato.