存储XML数据的数据类型:VARCHAR(MAX)或XML


9

我正在使用SQL Server 2008为一组新资源定义一个架构...在这种情况下,每个记录(例如row)将需要存储XML片段。不时 尽管不经常 我将需要查询XML以查找元素和属性值。如果任由我自己设计,尽管倾向于让我相信这是有问题的,但我倾向于使用xml数据类型。这使我想到了我的问题。

在这种情况下,尝试决定将XML存储在xml列与varchar(MAX)列之间时,应该考虑哪些因素

如果有帮助,这里有一些其他详细信息:

  • 对于这些片段(例如XSD的)使用架构的决定尚未决定
  • 碎片的大小范围从小到很大
  • 所有XML的格式都正确
  • 在一天的过程中,需要大约3个月的时间,通过在线查询支持收集多达10,000个碎片
  • 对XML的查询将全天进行,但是很少会出现这种类型的并发查询。

1
xml类型不能保证保留原始xml的确切格式,如果需要文档保持不变,则nvarchar(max)是唯一的选择。
MartinC 2012年

@MartinC如果片段格式正确,则可能发生什么变化?我相信你,我只是之前从未听过……您能为我指出更多细节吗?
JoeGeeky 2012年

例如,空标签<foo></foo>将变为<foo />
gbn 2012年

@gdn Ahhh,好吧...这不会改变含义,所以我也可以。
JoeGeeky 2012年

Answers:


5

如果sql server xml功能会对XML进行查询,请使用XML类型存储xml以避免强制转换

请记住,由于XML验证,XML类型的存储速度可能会稍慢,但是XML的基础类型是普通的varbinary(max)


1
基础数据不是VARBINARY(MAX)。这是一种优化的格式,这意味着即使您不打算查询它,也应该使用XML数据类型。
所罗门·鲁兹基

6

在尝试决定在xml列中存储XML 与varchar(MAX)列中存储XML之间应该考虑哪些因素

这些因素是:

  1. XML类型可通过XQuery表达式进行查询/解析,包括能够使用FLWOR语句和迭代
  2. 在数据XML变量和列可以内嵌经由使用XQuery表达式来修改XML DML
  3. XML数据以UTF-16 LE(小尾数法)存储,因此VARCHAR(MAX)选择不当,因为它可能导致数据丢失。因此,鉴于/ 也是UTF-16 LE ,真正的决定应该XML和之间。NVARCHAR(MAX)NCHARNVARCHAR
  4. XML可以根据XSD /验证数据XML SCHEMA COLLECTION。如果未指定XML Schema Collection,则不会进行任何验证(除了确保格式正确),但是使用时此选项不可用NVARCHAR(MAX)
  5. XML类型的一个主要好处是,它以高度优化的格式(不是VARBINARY(MAX)@Oleg的回答中所述)存储,该格式不存储您看到的确切字符串表示形式,而是具有一个元素和属性名称的字典并引用通过他们的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];

    返回值:

    XmlBytes   StringCharacters   StringBytes
    56         53                 106
    
    XmlBytes   StringCharacters   StringBytes
    84         133                266

    如您在上面的示例输出中看到的,添加四个元素(#s 3、4、5和6)VARCHAR将向NVARCHAR变量添加80个字符(如果使用,则为80个字节)和160个字节。但是,它仅向XML变量添加了28个字节,这比它所添加的要VARCHAR(以防万一有人因为UTF-16(多数是双字节)而赞成使用VARCHARover )。这种优化可以节省大量空间,并且其自身足够使用数据类型。XMLXMLXML

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.