簡體   English   中英

XQuery SQL Server 2005 慢

[英]XQuery SQL Server 2005 slow

全部,

我有以下示例 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>

我想在SQL Server 2005數據庫的表中插入上面的內容應該插入的方式如下:

Sample1, Sample2, Test1, Test2, Test3, Test6
Sample1, Sample2, Test1, Test2, Test3, Test7
Sample1, Sample2, Test1, Test2, Test3, Test8
Sample1, Sample2, Test1, Test2, Test3, Test9
Sample1, Sample2, Test1, Test2, Test3, Test10
Sample1, Sample2, Test1, Test2, Test3, Test11
Sample1, Sample2, Test1, Test2, Test3, Test12
Sample1, Sample2, Test1, Test2, Test3, Test13

如您所見,行數與 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)

您需要自己測試速度,但我認為這會更快一些。 根據查詢計划,您需要 99% 的時間,而這需要 1% 的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM