Xml选择查询xpath很慢

Mar*_*ins 1 xml sql t-sql sql-server sqlxml

我的XML结构:

<Items>
  <Item>
    <guid>FC550573-7171-997F-752D-8D65590CBFD6</guid>
    <Objects>
       <Object>
         <type>0</type>
         <guid>E10D9DA9-2C8D-8024-2F07-DF21395811BF</guid>
       </Object>
       <Object>
         <type>0</type>
         <guid>D8338400-35C7-781E-A039-C0FDDF80714A</guid>
       </Object>
    </Objects>
  </Item>
</Items>
Run Code Online (Sandbox Code Playgroud)

填充对象表时:

CREATE TABLE [dbo].[Objects](
    [item_guid] [varchar](36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [type] [int] NOT NULL,
    [guid] [varchar](36) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

使用查询:

INSERT INTO [dbname].[dbo].[Objects]
           ([item_guid]
           ,[type]
           ,[guid])
SELECT
 X.source.query('../../guid').value('.','VARCHAR(36)') as item_guid,
 X.source.query('type').value('.','INT') as type,
 X.source.query('guid').value('.','VARCHAR(36)') as guid
FROM(
Select xmldata from XmlFiles where fullpath=@fp
) AS T(x)
CROSS APPLY x.nodes('Items/Item/Objects/Object') As X(source)
Run Code Online (Sandbox Code Playgroud)

这一行使得查询非常缓慢:

X.source.query('../../guid').value('.','VARCHAR(36)') as item_guid
Run Code Online (Sandbox Code Playgroud)

这里适当的方法是什么?

Mik*_*son 8

使用/text()获取值有利于无类型XML的性能.使用父轴也是不好的../.. (如@marc_s建议的那样).

这是一个带有额外交叉应用的版本并/text()获取值.

试试这个:

select T2.N.value('(guid/text())[1]', 'uniqueidentifier') as item_guid,
       T3.N.value('(type/text())[1]', 'int') as type,
       T3.N.value('(guid/text())[1]', 'uniqueidentifier') as guid
from (SELECT xmldata FROM dbo.XmlFiles WHERE fullpath = @fp) as T1(N)
  cross apply T1.N.nodes('Items/Item') as T2(N)
  cross apply T2.N.nodes('Objects/Object') as T3(N)
Run Code Online (Sandbox Code Playgroud)

您必须判断哪个查询对您来说最快.