高效查询 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
我们正在将未类型化 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