在SQLServer 2005中查询XML列
时间:2020-03-05 18:50:07 来源:igfitidea点击:
我公司的"联系人"表中有一个字段。在该表中,有一个XML类型列。该列保存有关特定联系人的杂项数据。例如。
<contact> <refno>123456</refno> <special>a piece of custom data</special> </contact>
每个联系人的" contact"下面的标签可以不同,我必须查询这些片段
在同一表中的关系数据列旁边。
我曾经使用过类似的构造:
SELECT c.id AS ContactID,c.ContactName as ForeName, c.xmlvaluesn.value('(contact/Ref)[1]', 'VARCHAR(40)') as ref, INNER JOIN ParticipantContactMap pcm ON c.id=pcm.contactid AND pcm.participantid=2140 WHERE xmlvaluesn.exist('/contact[Ref = "118985"]') = 1
此方法可以正常运行,但是服务器需要一段时间才能响应。
我还研究了使用nodes()函数来解析XML节点,并使用existing()来测试节点是否拥有我要搜索的值。
有谁知道查询XML列的更好方法?
解决方案
回答
我发现msdn xml最佳实践对处理xml blob列很有帮助,可能会提供一些启发...
http://msdn.microsoft.com/zh-CN/library/ms345115.aspx#sql25xmlbp_topic4
回答
除了@pauljette提到的页面之外,此页面还提供了良好的性能优化建议:
http://msdn.microsoft.com/en-us/library/ms345118.aspx
我们可以做很多事情来提高XML查询的性能,但是它永远不会比正确索引的关系数据好。如果我们选择一个文档然后仅在该文档中进行查询,则可以做得很好,但是当查询需要扫描一堆相似的文档以查找某些内容时,这有点像关系查询计划中的关键查找(即慢)。
回答
如果我们要进行一次写入和大量读取,请在写入时进行分析命中,然后将数据转换为更易于查询的格式。第一个建议是将它们解析为一个相关但独立的表,其中包含名称/值/ contactID列。
回答
如果Xml具有XSD,则可以将其导入数据库,然后可以为Xml数据建立索引。