在XML文件上执行请求的性能

时间:2016-04-27 07:56:01

标签: sql sql-server xml

我有一个SQL-Server数据库,我需要从中提取存储在XML文件中的信息(在db中)。

我有桌子:mc_report

包含名为:original_xml

的nvarchar字段

我想做点什么

select id from mc_report where original_xml like '%mytext%';

知道该表可能包含数百(甚至数千)条记录,并且每个XML文件长达数百行

xml文件看起来像:http://pastebin.com/WQyvzngG

我想按序列进行过滤

pastebin中的第242行

<entry name="serial" type="string">Z4MDPDAVT</entry>

它会快吗?或者它会永远消失吗?

如果不快,我有哪些其他选择?

2 个答案:

答案 0 :(得分:1)

您可以将其放入WHERE子句中:

WHERE YourXmlColumn.exist('//entry[@name="serial" and .="Z4MDPDAVT"]')=1

如果你知道更高的节点(比如调查“sound_card”...... ),你可能会大大减少时间,因为XQuery不必遍历每一个条目,直到它找到一个拟合。 / p>

如果您想动态设置搜索条件,可以使用

DECLARE @prm AS VARCHAR(100)='Z4MDPDAVT';
[...]
WHERE YourXmlColumn.exist('//entry[@name="serial" and .=sql:variable("@prm")]')=1

或者您可以使用正在运行的查询的列的内容,如

WHERE YourXmlColumn.exist('//entry[@name="serial" and .=sql:column("ColumnName")]')=1

如果你真的陷入了性能问题,你可能会考虑触发将你正在搜索的值写入索引列。

您也可以考虑XML索引,但我会尽量避免这种情况......

答案 1 :(得分:0)

  

从mc_report中选择id,其中original_xml类似'%mytext%';

LIKE%SOMTHING是一个性能问题,XML与否。这是初学者所做的性能问题(在“什么是索引”之外)。它根本无法扩展 - 这就是为什么SQL Server中有一段时间的全文搜索。

  

问题是,现在数据库只包含10条记录,我需要   实现在生产中运行的代码,当db变大时需要工作

所以在更大的数据库上开发。初学者开发者问题2:未使用正确的数据大小。获取生成器并生成虚假数据。然后你就知道它的表现如何。