高效查询 SQL table 中的 XML 列

Efficiently query a XML column in SQL table

我们正在将未类型化 XML 数据存储到我们的一个表中。我们需要根据某些 XML 个节点中的特定值来查找数据。有问题的XML(简化)如下。

<Session id="4f3d4a2c-4f3e-4e53-816c-e0e1b10ee5ad" TimeStamp="2015-09-15T12:02:48">
  <Entries>
    <Entry DataItemId="System.Security.User.IsBroker">
        <Value>True</Value>
    </Entry>
    <Entry DataItemId="System.Security.User.IsOfficeAdmin">
        <Value>False</Value>
    </Entry>
    <Entry DataItemId="System.Security.User.BrokerId">
        <Value>32165498</Value>
    </Entry>
    <Entry DataItemId="System.Security.User.DisplayName">
        <Value>Mike Pearsons</Value>
    </Entry>
    <Entry DataItemId="Address.Line1">
        <Value>Long Marston</Value>
    </Entry>
   <Entry DataItemId="Address.Line2">    
       <Value>End Cottage</Value>
   </Entry>
   <Entry DataItemId="Address.Line3">    
       <Value>End Cottage</Value>
   </Entry>
   <Entry DataItemId="Address.Postcode">    
       <Value>End Cottage</Value>
   </Entry>
    .....
    .....
  </Entries>
</Session>

现在我们必须搜索 Address1 类似于“一些用户输入的文本。”的记录

目前我们正在使用以下查询来实现相同的目的

SELECT column1, column2, column 3, XMLColumn
FROM tblXMLData
WHERE 
(XMLColumn.value('(/Session/Entries/Entry[@DataItemId="Address.Line1"]/Value)[1]', 'varchar(210)'))
LIKE ('%sometext%')

虽然这给了我们想要的结果,但我只是想知道是否有更有效的方法来实现这个或可能更快的方法。查询有时需要几分钟才能 return 结果(来自 15k 条记录)。

您可以试试这个,大约是您发布的查询费用的一半。优点是它不必将 XML 数据转换为 SQL 数据,从而降低了开销:

DECLARE @Address varchar(210) = UPPER('user entered text')

SELECT  *
FROM    tblXMLData
WHERE   XMLColumn.exist('/Session/Entries/Entry[@DataItemId="Address.Line1" and contains(upper-case(.), sql:variable("@Address"))]') = 1

如果你发现你运行这类查询很多,你也可以考虑XML index