XQuery SQL Server 2005运行缓慢

XQuery SQL Server 2005运行缓慢,sql,sql-server,xml,Sql,Sql Server,Xml,全部, 我有以下示例XML: <Root> <Sample1>Sample1</Sample1> <Sample2>Sample2</Sample2> <Run> <Entry> <Level1A>Test1</Level1A> <Level1B>Test2</Level1B>

全部,

我有以下示例XML:

<Root>   
<Sample1>Sample1</Sample1>
<Sample2>Sample2</Sample2>
   <Run>
       <Entry>
             <Level1A>Test1</Level1A>
             <Level1B>Test2</Level1B>
             <Level1C>Test3</Level1C>
                 <Group>
                       <Level3>Test6</Level3>
                       <Level3>Test7</Level3>
                       <Level3>Test8</Level3>
                       <Level3>Test9</Level3>
                       <Level3>Test10</Level3>
                       <Level3>Test11</Level3>
                       <Level3>Test12</Level3>
                       <Level3>Test13</Level3>
                </Group>
       </Entry>
  </Run>  
</Root>
如您所见,行数与Level3的元素数相同

基于这个事实,我有一个存储过程

INSERT INTO @TESTTEMP
SELECT          
            ent.query('../../../../Sample1').value('.','VARCHAR(20)') As A
            ent.query('../../../../Sample2').value('.','VARCHAR(20)') As B
            ent.query('../../Level1A').value('.','VARCHAR(20)') As D,
            ent.query('../../Level1B').value('.','VARCHAR(20)') As E,           
            ent.query('../../Level1C').value('.','VARCHAR(20)') As F,
            ent.query('Level3').value('.','VARCHAR(20)') As G,
FROM @xmlMessage.nodes('//Root/Run/Entry/Group/Level3') Col(ent)
上面的代码工作得非常好,但速度非常慢。 我知道问题在于我在树上回溯的每一行有2级甚至4级。 我怎样才能加快速度

非常感谢,,
MK

我不得不稍微修改一下您的XML,但我认为您需要这样做

declare @xmlMessage xml =
'<Root>
  <Sample1>Sample1</Sample1>
  <Sample2>Sample2</Sample2>
    <Run>
      <Entry>
        <Level1A>Test1</Level1A>
        <Level1B>Test2</Level1B>
        <Level1C>Test3</Level1C>
        <Group>
          <Level3>Test6</Level3>
          <Level3>Test7</Level3>
          <Level3>Test8</Level3>
          <Level3>Test9</Level3>
          <Level3>Test10</Level3>
          <Level3>Test11</Level3>
          <Level3>Test12</Level3>
          <Level3>Test13</Level3>
        </Group>
      </Entry>
    </Run>
 </Root>'

SELECT T1.Col.value('Sample1[1]', 'varchar(20)') as A,
       T1.Col.value('Sample2[1]', 'varchar(20)') as B,
       T2.Col.value('Level1A[1]', 'varchar(20)') as D,
       T2.Col.value('Level1B[1]', 'varchar(20)') as E,
       T2.Col.value('Level1C[1]', 'varchar(20)') as F,
       T3.Col.value('.', 'varchar(20)') as G
FROM @xmlMessage.nodes('/Root') as T1(Col)
  cross apply T1.Col.nodes('Run/Entry') as T2(Col)
  cross apply T2.Col.nodes('Group/Level3') as T3(Col)
declare@xmlMessage xml=
'
样本1
样本2
测试1
测试2
测试3
测试6
测试7
测试8
测试9
测试10
测试11
测试12
测试13
'
选择T1.Col.value('Sample1[1]','varchar(20')作为,
T1.列值('Sample2[1],'varchar(20)')为B,
T2.列值('Level1A[1],'varchar(20)')为D,
T2.列值('Level1B[1]','varchar(20)'作为E,
T2.列值('Level1C[1]”,'varchar(20)'作为F,
T3.列值(‘.’,‘varchar(20)’)作为G
从@xmlMessage.nodes('/Root')作为T1(Col)
交叉应用T1.Col.nodes('Run/Entry')作为T2(Col)
交叉应用T2.列节点(“组/级别3”)作为T3(列)

你需要自己测试它的速度,但我认为这会快一点。根据查询计划,您需要99%的时间,而这需要1%的时间。

不要关注
XML
因素-目标表上是否存在其他潜在问题,如索引?您查看过最小日志插入吗?是的,我检查过问题不在插入期间,而是在XML树上的选择上。请记住,查询计划%根本不考虑时间因素-它是CPU和磁盘IO的组合。根据计划,最昂贵的手术可能是最快的。@Mikael:回答得很好。它现在工作得快多了!谢谢你的帮助。
declare @xmlMessage xml =
'<Root>
  <Sample1>Sample1</Sample1>
  <Sample2>Sample2</Sample2>
    <Run>
      <Entry>
        <Level1A>Test1</Level1A>
        <Level1B>Test2</Level1B>
        <Level1C>Test3</Level1C>
        <Group>
          <Level3>Test6</Level3>
          <Level3>Test7</Level3>
          <Level3>Test8</Level3>
          <Level3>Test9</Level3>
          <Level3>Test10</Level3>
          <Level3>Test11</Level3>
          <Level3>Test12</Level3>
          <Level3>Test13</Level3>
        </Group>
      </Entry>
    </Run>
 </Root>'

SELECT T1.Col.value('Sample1[1]', 'varchar(20)') as A,
       T1.Col.value('Sample2[1]', 'varchar(20)') as B,
       T2.Col.value('Level1A[1]', 'varchar(20)') as D,
       T2.Col.value('Level1B[1]', 'varchar(20)') as E,
       T2.Col.value('Level1C[1]', 'varchar(20)') as F,
       T3.Col.value('.', 'varchar(20)') as G
FROM @xmlMessage.nodes('/Root') as T1(Col)
  cross apply T1.Col.nodes('Run/Entry') as T2(Col)
  cross apply T2.Col.nodes('Group/Level3') as T3(Col)