为什么使用XML类型在SQL Server中存储XML数据?

时间:2011-08-11 16:40:25

标签: sql sql-server xml

我正在玩并学习使用Microsoft SQL Server。我想将XML文档存储在表中,不会在表中修改部分XML文档(即,任何更改都将通过更新该单元中的整个XML文档来完成)。

从我所看到的,我可以将XML文档存储在Xml类型的列或varchar(MAX)中。

各自的优点和缺点是什么?

6 个答案:

答案 0 :(得分:6)

XML数据类型支持:

此外,使用XML类型,你很难做到初级开发人员在处理XML时遇到的典型错误:将其作为字符串威胁,混合或忽略UTF8和UTF16等编码,忽略命名空间,混淆或忽略处理指令等等。

请阅读XML Best Practices for Microsoft SQL Server 2005

答案 1 :(得分:4)

是的,你可以。

现在,继续阅读文档。关于更好地搜索XML的部分 - 您可以在XML字段上放置一个索引,它将允许您比XML文本字段更多的特定于XML的查询语法,因为XML字段在内部解析XML。

答案 2 :(得分:3)

引自以下SO帖子:Microsoft SQL Server 2005/2008: XML vs text/varchar data type

  

如果将xml存储在xml类型列中,则不会存储数据   作为简单文本,如在nvarchar情况下,它将存储在一些文本中   解析数据树的类型,而后者将小于   未解析的xml版本。这不仅减少了数据库大小,而且   为您提供其他优势,如验证,易操作等。   (即使你没有使用其中任何一个,他们仍然在那里   未来的使用)。

     

另一方面,服务器必须解析数据   插入,这可能会减慢你的数据库 - 你必须   做出速度与尺寸的决定。

     

就个人而言,我认为数据库中的数据应该存储为xml   只有当它具有在关系中难以实现的结构时   模型,例如布局,样式描述等通常意味着   没有太多的数据和速度不是问题,因此添加了xml   功能,如数据验证和操作能力(也是,最后   但并非最不重要的是,能够点击管理工作室中的价值   并看到格式化的xml - 我真的很喜欢这个功能!),超重了   成本。

     

我没有直接存储大量xml的经验   数据库,如果我有选择,我不会这样做,因为它是   几乎总是慢一个关系模型,但如果那将是   case,我建议分析两个选项,并在大小之间进行选择   和速度最适合您的需求。

答案 3 :(得分:1)

我做了一些测试来比较无类型XML,类型化XML和NVARCHAR(MAX)之间的插入性能。我发现XML是禁食的,并且在磁盘上使用的存储空间最小。我做的测试,插入7,936,510行。它在https://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd使用了XSD。

我运行了两次类型化的XML测试。第一次采取01:23:26.1355961。我第二次参加01:15:15.5957446。磁盘大小为57,520,685,056。

无类型的XML测试占用了00:48:48.6290364,在磁盘上为36,515,610,624。

NVARCHAR(MAX)测试时间为00:50:22.1841067,磁盘上为72,620,179,456。

注意,我删除并重新创建了每个测试的数据库。

我对此的看法是,最好使用无类型XML而不是NVARCHAR(MAX),因为它使用的磁盘少得多。也许如果您只使用非Unicode VARCHAR,那就不那么重要了。我认为它可能使用两个字节来存储每个字符。但是,文件中还有很多空格。所以那里存在很多浪费的存储空间。所以,这可能与它有关。

我不确定使用类型化XML与非类型化XML相关的额外缓慢程度有多少是由于验证,或者,如果存在其他差异。如果我没记错的话,我曾经读过数据存储在隐藏表中的关系。我不确定它是否适用于类型化和非类型化的XML。

我还没有测试过查询性能。我假设键入的XML会更快。

另外,我指定键入的XML是DOCUMENT,而不是默认的CONTENT。

答案 4 :(得分:0)

1.它基于标准:SQLXML,因此您可以期望其他主要数据库具有类似的功能。

2.Queries可能使用XPATH等标准

3.您可以索引数据

4.如果您有数据存储架构(更少)并且基于类型信息执行查询优化

答案 5 :(得分:0)

缺点: 如果要将结构化xml数据存储在xml数据字段中,则复制当前不会同步发布者和订阅者之间的更改。

e.g。如果订阅者更改了一个xml元素,并且发布者更改了同一个xml数据列的另一个元素,则会发生冲突 - 一个会丢失,您必须手动找到丢失数据的解决方案。

优点: 许多Web /桌面应用程序将其数据存储为xml数据类型 - 这可以很容易地映射到sql xml数据类型。