Сглаживание иерархического XML в SQL с помощью метода nodes ()

У меня есть хранимая процедура, которая принимает XML-документ в качестве параметра, аналогичного по структуре следующей:

<grandparent name="grandpa bob">
  <parent name="papa john">
    <children>
      <child name="mark" />
      <child name="cindy" />
    </children>
  </parent>
  <parent name="papa henry">
    <children>
      <child name="mary" />
    </children>
  </parent>
</grandparent>

Мое требование - «сгладить» эти данные, чтобы их можно было вставить во временную таблицу и управлять ими дальше. процедура, поэтому приведенный выше XML становится:

Grandparent Name Parent Name     Child Name
---------------- --------------- ---------------
grandpa bob      papa john       mark
grandpa bob      papa john       cindy
grandpa bob      papa henry      mary

Это в настоящее время выполняется с использованием узлов XML SQL Server:

SELECT
    VIRT.node.value('../../../@name','varchar(15)') 'Grandparent Name',
    VIRT.node.value('../../@name','varchar(15)') 'Parent Name',
    VIRT.node.value('@name','varchar(15)') 'Child Name'
FROM
    @xmlFamilyTree.nodes('/grandparent/parent/children/child') AS VIRT(node)

Это отлично работает, пока я не начну бросать в процедуру большие объемы данных (т.е. 1000+ дочерний элемент ] узлов), после чего он останавливается и выполняется от 1 до 2 минут. Я думаю, это может быть связано с тем, что я начинаю с самого низкого уровня ( ), а затем просматриваю XML-документ для каждого случая. Может ли разделение этого единственного запроса на 3 части (по одному на каждый узел, с которого мне нужны данные) улучшить производительность здесь? Учитывая, что ни на одном из этих узлов нет «ключей», которые я мог бы использовать для резервного копирования, мог бы кто-нибудь предложить какие-нибудь указатели, как я могу это сделать?

5
задан Matt Weldon 27 April 2011 в 07:03
поделиться