在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数据建立索引。