Parece que respondí mi propia pregunta después de buscar un poco más en línea:
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)
Usando CROSS APPLY
Puedo seleccionar el grandparent
de nivel superior nodo y use esto para seleccionar el hijo parent
nodos y así sucesivamente. Con este método, he evitado que mi consulta se ejecute en alrededor de 1 minuto y 30 segundos hasta alrededor de 6 segundos .
Curiosamente, sin embargo, si uso el "antiguo" OPEN XML
método para recuperar los mismos datos, la consulta se ejecuta en 1 segundo !
Parece que es posible que deba abordar el uso de estas dos técnicas caso por caso, según el tamaño/complejidad esperados del documento que se está transfiriendo.