繁体   English   中英

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

[英]Why use XML type to store XML data in SQL Server?

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

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

各自的优缺点是什么?

XML 数据类型支持:

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

请阅读XML Microsoft SQL 服务器 2005 的最佳实践

是的你可以。

现在,go 进一步阅读文档。 The part about better search for XML - you can put an index on a XML field and it will allow you a lot more query syntax specific for XML than a text field because XML fields internally parse the XML.

引用自以下 SO 帖子: Microsoft SQL Server 2005/2008:XML 与 text/varchar 数据类型

If you store xml in an xml typed column, the data will not get stored as simple text, as in the nvarchar case, it will be stored in some sort of parsed data tree, which in turn will be smaller than the unparsed xml version. 这不仅减少了数据库的大小,而且还为您提供了其他优势,例如验证、易于操作等(即使您没有使用任何这些,但它们仍可供将来使用)。

另一方面,服务器必须在插入时解析数据,这可能会减慢您的数据库速度 - 您必须决定速度与大小。

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

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

我做了一些测试来比较无类型 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。

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

2.查询可使用XPATH等标准

3.您可以索引数据

4.如果你有数据存储的模式(less)并且基于类型信息执行查询优化

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

例如,如果订阅者更改了 xml 元素,而发布者更改了同一 xml 数据列的不同元素,那么就会发生冲突 - 一个会丢失,您必须手动找到丢失数据的解决方案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM