У якому типі даних зберігати XML-дані: VARCHAR (MAX) або XML


9

Я визначаю схему для нового набору ресурсів за допомогою SQL Server 2008 ... У цьому випадку для кожного запису ( наприклад, рядок ) потрібно буде зберігати фрагменти XML. Час від часу; хоча не часто; Мені потрібно запитати XML, щоб знайти значення елементів та атрибутів. Якщо залишити свої власні розробки, я б схильний використовувати тип даних xml, хоча мене вважають, що це пов'язано з проблемами. Отже, це призводить мене до моїх запитань.

З огляду на цей сценарій, які чинники я повинен розглядати при спробі вирішити між зберіганням XML в XML - стовпці проти в VARCHAR (MAX) колонка

Якщо це допомагає… ось кілька додаткових деталей:

  • Жодного рішення щодо використання схем для цих фрагментів не прийнято ( наприклад, XSD )
  • Розміри фрагментів будуть варіюватися від маленьких до дуже великих
  • Усі XML будуть добре сформовані
  • За добу буде зібрано до ~ 10000 фрагментів, зібраних за допомогою онлайн-запитів, необхідних протягом ~ 3 місяців
  • Запити проти XML будуть виникати протягом дня, але вони повинні залишатися легкими з кількома одночасними запитами такого типу

1
Тип xml не гарантує збереження точної форми вихідного xml, якщо необхідність документа не змінюється, тоді nvarchar (max) - єдиний варіант.
MartinC

@MartinC Якщо фрагмент добре сформований, яка зміна може статися? Я вірю вам, я просто раніше цього не чув ... Чи можете ви вказати мені ще деталі?
JoeGeeky

Наприклад, порожні теги <foo></foo>стануть<foo />
gbn

@gdn Ahhh, добре ... це не змінює значення, так що зі мною все нормально.
JoeGeeky

Відповіді:


5

Якщо запити проти XML відбуватимуться за допомогою можливостей xml-сервера sql, тоді використовуйте тип XML, щоб зберігати xml, щоб уникнути кастингу

І

майте на увазі, що тип XML може зберігатися трохи повільніше через перевірку XML, але базовим типом XML є звичайний варбінарний (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)як зазначено у відповіді @ Олега), який не зберігає точне відображення рядків, яке ви бачите, а натомість має словник імен елементів та атрибутів і посилається їм за їх посвідченням. Це також видаляє пробіли. Спробуйте наступне:

    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), додано 80 символів (отже, 80 байт, якщо використовується VARCHAR) і 160 байт до NVARCHARзмінної. Тим НЕ менше, це лише додало 28 байт в змінну XML, який менше , ніж доданий VARCHAR(тільки в разі , якщо хто - то буде сперечатися на користь VARCHARбільш , XMLтому що XMLце UTF-16 , який [ в основному] двухбайтное). Ця оптимізація може заощадити багато місця, і сама по собі є достатньою підставою для використання XMLтипу даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.