В каком типе данных хранить данные XML: VARCHAR (MAX) или XML

9

Я определяю схему для нового набора ресурсов с использованием SQL Server 2008 ... В этом случае каждая запись ( например, строка ) должна будет хранить фрагменты XML. Временами; хотя и не часто; Мне нужно запросить XML, чтобы найти значения элементов и атрибутов. Если бы я оставил свои собственные разработки, я бы использовал тип данных xml, хотя меня убеждали, что это связано с проблемами. Так что это подводит меня к моим вопросам.

Учитывая этот сценарий, какие факторы я должен рассматривать при попытке решить между хранением XML в XML - столбце против в VARCHAR (MAX) колонка

Если это поможет ... вот некоторые дополнительные детали:

  • Не было принято никакого решения относительно использования схем для этих фрагментов ( например, XSD )
  • Размеры фрагментов будут варьироваться от маленьких до очень больших
  • Весь XML будет правильно сформирован
  • В течение дня будет собрано до ~ 10 000 фрагментов с поддержкой онлайн-запросов в течение ~ 3 месяцев
  • Запросы к XML будут происходить в течение дня, но они должны оставаться легкими с несколькими параллельными запросами этого типа
JoeGeeky
источник
1
Тип xml не гарантирует сохранения точной формы исходного xml, если существует требование, чтобы документ оставался неизменным, тогда nvarchar (max) - единственный вариант.
MartinC
@MartinC Если фрагмент уже правильно сформирован, какие изменения могут произойти? Я верю тебе, я просто не слышал этого раньше ... Не могли бы вы указать мне еще некоторые детали?
JoeGeeky
Пример, пустые теги <foo></foo>станут<foo />
gbn
@ gdn Аааа, хорошо ... это не меняет смысла, так что со мной все в порядке.
JoeGeeky

Ответы:

5

Если запросы к XML будут выполняться с помощью возможностей SQL Server SQL, используйте тип XML для хранения XML, чтобы избежать приведения

А также

имейте в виду, что тип XML может храниться немного медленнее из-за проверки XML, но основным типом XML является обычный varbinary (max)

Олег Док
источник
1
Основополагающих данных нет VARBINARY(MAX). Это оптимизированный формат, который означает, что даже если вы не собираетесь запрашивать его, вы все равно должны использовать XMLтип данных.
Соломон Руцкий,
6

какие факторы следует учитывать при попытке выбора между хранением 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)как указано в ответе @ Oleg), который не хранит точное строковое представление, которое вы видите, а вместо этого имеет словарь имен и ссылок на атрибуты и атрибуты. им по их удостоверению личности. Это также удаляет пробелы. Попробуйте следующее:

    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

    Как видно из приведенного выше примера, при добавлении четырех элементов (# 3, 4, 5 и 6) VARCHARк NVARCHARпеременной добавляется 80 символов (следовательно, 80 байт при использовании ) и 160 байт . Тем не менее, он добавил только 28 байтов к переменной XML, что меньше, чем он добавил VARCHAR(на тот случай, если кто-то собирался спорить в пользу VARCHARover, XMLпотому что XMLэто UTF-16, который [в основном] является двухбайтовым). Эта оптимизация может сэкономить массу места и сама по себе является достаточной причиной для использования XMLтипа данных.

Соломон Руцкий
источник