将 XML 数据存储在哪种数据类型中:VARCHAR(MAX) 或 XML

Joe*_*eky 14 schema sql-server-2008 xml database-design datatypes

我正在使用 SQL Server 2008 为一组新资源定义架构...在这种情况下,每条记录(例如行)都需要存储 XML 片段。时; 虽然不经常;我需要查询 XML 以查找元素和属性值。如果留给我自己的设备,我会倾向于使用XML数据类型,尽管我一直认为这是有问题的。所以这让我想到了我的问题。

鉴于这种情况,在尝试决定将 XML 存储在XML列中还是varchar(MAX)列中时,我应该考虑哪些因素

如果有帮助……这里有一些额外的细节:

  • 尚未决定对这些片段(例如 XSD)使用模式
  • 碎片的大小从小到大不等
  • 所有 XML 都将是格式良好的
  • 在一天的过程中,将收集多达约 10,000 个片段,需要约 3 个月的在线查询支持
  • 对 XML 的查询将全天发生,但应该保持轻量级,很少有这种类型的并发查询

Sol*_*zky 14

哪些因素应该我想在存储XML之间做出选择时,可以考虑xml柱与一varchar(MAX)

这些因素是:

  1. XML类型可通过 XQuery 表达式查询/解析,包括能够使用FLWOR 语句和迭代

  2. 在数据XML变量和列可以内嵌经由使用XQuery表达式来修改XML DML

  3. XML数据存储为 UTF-16 LE(Little Endian),因此VARCHAR(MAX)将是一个糟糕的选择,因为它可能导致数据丢失。因此,真正的决定应该XML和之间NVARCHAR(MAX),因为NCHAR/NVARCHAR也是 UTF-16 LE。

  4. XML可以针对 XSD / 验证数据XML SCHEMA COLLECTION。如果未指定 XML 架构集合,则不进行验证(在确保格式良好之外),但在使用NVARCHAR(MAX).

  5. XML类型的一个主要好处是,它是存储在一个高度优化的格式(不VARBINARY(MAX)作为陈述@奥列格的答案),不存储精确的字符串表示你看到的,而是具有元素的字典和属性的名称和指通过他们的 ID 发给他们。它还删除空格。请尝试以下操作:

    DECLARE @Test1 XML = N'<Test><TagName>1</TagName><TagName>2</TagName></Test>';
    
    DECLARE @String1 NVARCHAR(MAX) = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    
    SET @Test1 = N'<Test><TagName>1</TagName><TagName>2</TagName><TagName>3</TagName>
    <TagName>4</TagName><TagName>5</TagName><TagName>6</TagName></Test>';
    
    SET @String1 = CONVERT(NVARCHAR(MAX), @Test1);
    
    SELECT DATALENGTH(@Test1) AS [XmlBytes],
           LEN(@String1) AS [StringCharacters],
           DATALENGTH(@String1) AS [StringBytes];
    
    Run Code Online (Sandbox Code Playgroud)

    返回:

    XmlBytes   StringCharacters   StringBytes
    56         53                 106
    
    XmlBytes   StringCharacters   StringBytes
    84         133                266
    
    Run Code Online (Sandbox Code Playgroud)

    正如您在上面的示例输出中所见,添加四个元素(#s 3、4、5 和 6)VARCHAR会向NVARCHAR变量添加 80 个字符(因此如果使用 则为 80 个字节)和 160 个字节。然而,它只向 XML 变量添加了 28 个字节,这比它添加的要VARCHAR(以防有人会争论支持VARCHARover,XML因为XMLUTF-16 是 [主要] 双字节)。这种优化可以节省大量空间,这本身就是使用XML数据类型的充分理由。

  6. XML 数据可以通过专门的XML 索引建立索引


Ole*_*Dok 7

如果sql server xml 功能会发生针对 XML 的查询,则使用 XML 类型来存储 xml 以避免强制转换

请记住,由于 xml 验证,XML 类型的存储速度可能会慢一点,但 XML 的底层类型是普通的 varbinary(max)

  • 基础数据不是`VARBINARY(MAX)`。它是一种优化的格式,这意味着即使您不打算查询它,您仍然应该使用 `XML` 数据类型。 (5认同)
  • 关于。“由于 xml 验证,速度有点慢”。最好能看到从 XML 到字符串以及从字符串到 XML 的转换时间与您提到的 XML 验证的比较。 (2认同)