Parece que respondi minha própria pergunta depois de pesquisar um pouco mais on-line:
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
Posso selecionar o grandparent
de nível superior nó e use isso para selecionar o filho parent
nós e assim por diante. Usando esse método, tirei minha consulta da execução em cerca de 1 minuto e 30 segundos até cerca de 6 segundos . Curiosamente, porém, se eu usar o "antigo"
OPEN XML
método para recuperar os mesmos dados, a consulta é executada em 1 segundo ! Parece que você pode ter que abordar o uso dessas duas técnicas caso a caso, dependendo do tamanho/complexidade esperado do documento que está sendo transmitido.