我正在使用 SQL Server 2008 为一组新资源定义一个架构...在这种情况下,每条记录(例如 row)都需要存储 XML 片段。时; 虽然不经常;我需要查询 XML 以查找元素和属性值。如果留给我自己的设备,我会倾向于使用XML数据类型,尽管我被引导相信这是有问题的。所以这导致我的问题。
鉴于这种情况,在尝试决定将 XML 存储在XML列还是varchar(MAX)列之间时,我应该考虑哪些因素
如果有帮助……这里有一些额外的细节:
- 尚未就这些片段(例如 XSD)使用模式做出决定
- 碎片的大小从小到大不等
- 所有 XML 都将是格式良好的
- 在一天的过程中,将收集多达约 10,000 个片段,需要约 3 个月的在线查询支持
- 针对 XML 的查询将全天发生,但应保持少量此类并发查询
这些因素是:
该
XML
类型可通过 XQuery 表达式进行查询/解析,包括能够使用FLWOR 语句和迭代变量和列中的数据
XML
可以通过XML DML使用 XQuery 表达式进行内联修改。XML
数据存储为 UTF-16 LE (Little Endian),因此VARCHAR(MAX)
将是一个糟糕的选择,因为它可能导致数据丢失。因此,真正的决定应该在XML
和之间NVARCHAR(MAX)
,因为NCHAR
/NVARCHAR
也是 UTF-16 LE。XML
可以针对 XSD / 验证数据XML SCHEMA COLLECTION
。如果未指定 XML Schema Collection,则不会进行任何验证(除了确保格式正确),但在使用NVARCHAR(MAX)
.XML 类型的一个主要好处是它以高度优化的格式存储(不像
VARBINARY(MAX)
@Oleg的答案中所述),它不存储您看到的确切字符串表示,而是具有元素和属性名称的字典并引用通过他们的 ID 给他们。它还删除了空格。尝试以下操作:回报:
正如您在上面的示例输出中所看到的,添加四个元素(#s 3、4、5 和 6)会为变量添加 80 个字符(因此如果使用 80 个字节
VARCHAR
)和 160 个字节。NVARCHAR
然而,它只向 XML 变量添加了 28 个字节,这比它添加的要少VARCHAR
(以防万一有人反对,VARCHAR
因为XML
UTFXML
-16 [大部分] 是双字节的)。这种优化可以节省大量空间,并且本身就有足够的理由使用XML
数据类型。XML 数据可以通过专门的XML 索引进行索引
如果对 XML 的查询将通过 sql server xml 功能发生,则使用 XML 类型存储 xml 以避免强制转换
和
请记住,由于 xml 验证,XML 类型的存储速度可能会慢一些,但 XML 的底层类型是普通的 varbinary(max)
原始答案中未讨论的 NVARCHAR(MAX) 之间存储差异的主要原因是 NVARCHAR(MAX) 不使用SCSU;除了下面提到的页面压缩之外,使用 NVARCHAR(N) + NVARCHAR(MAX) 列对可以显着降低存储需求。有关 NVARCHAR(MAX),请参阅SQL Server 2017 中的手动 SCSU“压缩”
—
其他答案中不存在的一个考虑因素与页面压缩有关。使用页面压缩,有一些非常具体的用例,其中将 XML 存储为 NVARCHAR(MAX)可能是有益的,具体取决于某些特定因素。
这是一种特殊情况,只能在数据和使用情况分析后考虑。在所呈现的场景中,这似乎不太可能。
何时考虑NVARCHAR ( MAX ) over XML:
一些缺点和反驳:
在我一直在研究的一个非常具体的场景中,当应用于许多具有高重复性的小片段时,使用 NVARCHAR(MAX) 可以减少 20% 以上的磁盘使用量。YMMV。使用实际数据和用法进行测试。