我有一个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>
它会快吗?或者它会永远消失吗?
如果不快,我有哪些其他选择?
答案 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:未使用正确的数据大小。获取生成器并生成虚假数据。然后你就知道它的表现如何。