优化删除没有子元素的XML元素

时间:2015-03-12 12:11:19

标签: xml tsql xpath sql-server-2012 xquery

我在变量中存储了一个很大的XML值。我首先删除属性condition设置为@Suspended的所有1元素:

 SET @A.modify('delete /definitions/definition/conditions/group/condition[@Suspended=1]')

然后我想删除所有没有group个元素的condition元素(在上一次删除后没有留下子元素)。我已设法使用以下语句执行此操作:

SET @A.modify('delete for $Node in /definitions/definition/conditions/group 
                                where not ( ($Node/condition)[1] instance of element() )
                                return $Node
                             ')

第一次删除非常快 - 0秒。第二个删除执行时间约为8秒。

我正在寻找更好/更快的方法来执行第二次删除。


以下是示例XML结构:

<definitions>
  <definition>
    <conditions>
      <group name="Group 1">
        <condition name="condition" type="answerisin" objType="question" objID="213219" Suspended="1">
          <value name="parameter">12</value>
        </condition>
        <condition name="condition" type="answerisin" objType="question" objID="113219" Suspended="1">
            <value name="parameter">4</value>
        </condition>
      </group>
    </conditions>
  </definition>
  <definition>
    <conditions>
      <group name="Group 1">
        <condition name="condition" type="answerisin" objType="question" objID="213219" Suspended="1">
          <value name="parameter">34</value>
        </condition>
      </group>
      <group name="Group 2">
        <condition name="condition" type="answerisin" objType="question" objID="213219">
          <value name="parameter">12</value>
        </condition>
      </group>
    </conditions>
  </definition>
</definitions>

1 个答案:

答案 0 :(得分:2)

你可以改写:

set @A.modify('delete /definitions/definition/conditions/group[empty(condition)]');

但我怀疑它会更快。查询计划有些不同,但在对性能至关重要的部分中大致相同。

可能对您有用的另一个选项是将XML分解为definitions/definition上的表变量,修改表变量中的XML,然后使用for xml path重新创建XML。

declare @T table(X xml);

insert into @T(X)
select T.X.query('.')
from @A.nodes('/definitions/definition') as T(X);

update @T
set X.modify('delete /definition/conditions/group[empty(condition)]');

set @A = (
         select T.X as '*'
         from @T as T
         for xml path(''), root('definitions')
         );

在我的测试中,粉碎XML并在小块中进行修改比修改大型XML快10倍。但这当然取决于你的实际XML是什么样的,以及definitions/definition上的粉碎是否足够精细。<​​/ p>

相关问题