Поделиться через


Столбцы и типы XML-данных (SQL Server)

В этом разделе описаны преимущества и ограничения типа данных xml в SQL Server, а также сведения, помогающие выбрать способ хранения XML-данных.

Модель данных: реляционная или XML

Если данные хорошо структурированы и известна их схема, то для их хранения наверняка лучше всего подойдет реляционная модель. В SQL Server предусмотрены все необходимые для этого средства и функции. С другой стороны, если данные структурированы частично, не структурированы или если их структура неизвестна, следует подумать о моделировании таких данных.

XML является удачным выбором, если нужна не зависящая от платформы модель, позволяющая гарантировать совместимость данных за счет применения структурной и семантической разметки. Кроме того, этот вариант уместен, если выполняются некоторые из следующих условий:

  • данные разрежены, их структура неизвестна или их структура может значительно измениться в будущем;

  • данные представляют иерархию контейнеров, а не ссылки между сущностями, и могут быть рекурсивными;

  • данные упорядочены;

  • требуется запрашивать данные или обновлять их фрагменты на основе их структуры.

Если ни одно из этих условий не выполняется, следует выбрать реляционную модель данных. Например, если данные представлены в формате XML, но приложение пользуется базой данных только для их хранения и извлечения, то для этого вполне подойдет тип данных [n]varchar(max). Хранение данных в XML-столбце обеспечивает дополнительные преимущества. В их число входят проверка структуры и правильности данных, а также поддержка детализированных запросов и обновлений XML-данных.

Причины хранения XML-данных в SQL Server

Ниже приведены некоторые условия, при которых лучше использовать собственные XML-функции SQL Server, а не управлять XML-данными, хранящимися в файловой системе.

  • Требуется эффективно распространять, запрашивать и изменять свои XML-данные на основе транзакций. Большое значение имеет высокая детализация доступа к данным. Например, иногда нужно извлекать некоторые разделы XML-документа или вставлять в него новые разделы без замены всего документа.

  • Предстоит иметь дело с реляционными и XML-данными, и необходимо обеспечить их совместимость в приложении.

  • Необходима языковая поддержка запросов и модификации данных в приложениях, охватывающих несколько доменов.

  • Требуется, чтобы сервер гарантировал верность структуры данных и, возможно, проверял данные в соответствии с XML-схемами.

  • Требуется проиндексировать XML-данные для оптимизации обработки запросов и улучшения масштабируемости и использовать эффективный оптимизатор запросов.

  • Требуется обращаться к XML-данным, используя технологии SOAP, ADO.NET и OLE DB.

  • Требуется использовать для управления XML-данными средства администрирования, реализованные в сервере баз данных. Примерами таких задач управления могут служить резервное копирование данных, их восстановление и репликация.

Если же ни одно из этих условий не выполняется, то для хранения данных лучше использовать отличный от XML тип больших объектов (например, [n]varchar(max) или varbinary(max)).

Варианты хранения XML-данных

SQL Server поддерживает несколько вариантов хранения XML-данных.

  • Естественное хранение в виде типа xml

    Данные при этом хранятся во внутреннем представлении, которое обеспечивает неизменность XML-содержимого данных. Это внутреннее представление включает в себя сведения об иерархии контейнеров, порядке документов и значений элементов и атрибутов. Точнее говоря, при этом обеспечивается неизменность InfoSet-содержимого XML-данных. Сведения о спецификации InfoSet можно найти по адресу: http://www.w3.org/TR/xml-infoset. InfoSet-содержимое не всегда идентично текстовым XML-данным, потому что следующая информация при этом не сохраняется: несущественные пробелы, порядок атрибутов, префиксы пространств имен и XML-декларация.

    Для типизированного (то есть связанного с XML-схемой) типа данных xml модуль проверки после обработки схемы (PSVI) добавляет в информационный набор данные о типах и кодирует их во внутреннее представление. Это значительно ускоряет синтаксический анализ. Дополнительные сведения см. в спецификациях XML-схем, разработанных консорциумом W3C XML. Найти их можно по адресам http://www.w3.org/TR/xmlschema-1 и http://www.w3.org/TR/xmlschema-2.

  • Сопоставление XML-данных и данных, хранящихся в реляционном формате

    Используя аннотированную схему (AXSD), можно разбить XML на столбцы одной или нескольких таблиц. Это обеспечивает правильность данных на реляционном уровне. В результате гарантируется сохранность иерархической структуры данных, хотя порядок элементов не учитывается. Схема не может быть рекурсивной.

  • Хранение больших объектов, [n]varchar(max) и varbinary(max)

    При этом хранится идентичная копия данных. Это полезно в приложениях специального назначения, например в приложениях, обрабатывающих юридическую документацию. Большинству приложений точная копия данных не нужна — им хватает XML-содержимого (правильности элементов InfoSet).

Обычно используется сочетание этих подходов. Например, XML-данные можно сохранить в столбце типа xml, производя продвижение его свойств до уровня реляционных столбцов. Или же можно использовать технологию сопоставления для хранения нерекурсивных фрагментов в столбцах, отличных от XML, а в столбцах типа xml хранить только рекурсивные фрагменты.

Выбор XML-технологии

Выбор между естественным форматом XML и XML-представлениями обычно зависит от следующих факторов.

  • Параметры хранения

    Иногда XML-данные (например, руководство по продукции) лучше хранить как большой объект, а в других ситуациях — в реляционных столбцах (например, описание товара, преобразованное в формат XML). Каждый вариант хранения данных обеспечивает точность документа в разной степени.

  • Обработка запросов

    Иногда один вариант хранения данных лучше другого соответствует природе и интенсивности запросов XML-данных. Степень поддержки детализированных запросов XML-данных, например оценки предикатов для XML-узлов, поддерживается двумя технологиями хранения данных в разной степени.

  • Индексирование XML-данных

    Возможно, потребуется проиндексировать XML-данные, чтобы ускорить обработку XML-запросов. Возможности индексирования зависят от технологии хранения данных; для оптимизации рабочей нагрузки нужно выбрать более подходящий вариант.

  • Возможности модификации данных

    Некоторые виды рабочей нагрузки сопряжены с детализированной модификацией XML-данных. Это может требоваться, например, при добавлении нового раздела в документ, в то время как при решении других задач, таких как обработка веб-содержимого, это не нужно. Для разработчиков того или иного приложения большое значение может иметь поддержка языка модификации данных.

  • Поддержка схем

    XML-данные можно описать при помощи схемы, которая может быть, а может и не быть документом XML-схемы. Поддержка связанных со схемой XML-данных зависит от XML-технологии.

Кроме того, технологии хранения XML-данных различаются по быстродействию.

Хранение XML-данных в собственном формате

XML-данные можно хранить на сервере в столбце типа xml. Этот вариант уместен, если выполняются следующие условия:

  • необходим простой способ хранения XML-данных на сервере, при этом нужно сохранить порядок и структуру документа;

  • существует вероятность отсутствия схемы XML-данных;

  • требуется запрашивать и изменять XML-данные;

  • требуется проиндексировать XML-данные для ускорения обработки запросов;

  • требуется использовать в приложении представления системного каталога для управления XML-данными и XML-схемами.

Механизм хранения XML-данных в естественном формате полезен, если есть XML-документы, имеющие разную структуру, или XML-документы, соответствующие разным или сложным схемам, которые слишком трудно сопоставить с реляционными структурами.

Пример: моделирование XML-данных с использованием типа данных xml

Допустим, мы имеем дело с руководством по продукции в формате XML, которое охватывает ряд тем, разделенных на несколько глав, включающих по несколько разделов. Раздел может содержать подразделы. Таким образом, элемент <section> является рекурсивным. Руководства по продукции содержат большой объем смешанной информации, диаграмм и технических характеристик; эти данные структурированы частично. Пользователям руководств может пригодиться возможность контекстного поиска интересующих их тем, например подраздела «кластеризованный индекс» в разделе «индексирование», и запроса технических характеристик.

Для хранения таких XML-документов прекрасно подходит столбец типа xml. Это позволяет сохранить InfoSet-содержимое XML-данных. Индексирование XML-столбца позволяет повысить эффективность обработки запросов.

Пример: сохранение точных копий XML-данных

Предположим, что правительственные законы требуют, чтобы хранились точные текстовые копии XML-документов. К этой категории могут относиться подписанные документы, юридические постановления и отчеты о биржевых операциях. Такие данные можно хранить в столбце типа [n]varchar(max).

При обработке запросов во время выполнения преобразуйте данные в тип xml и выполните для них запрос XQuery. Преобразование типов в период выполнения может быть связано со значительной тратой ресурсов, особенно если документ велик. При высокой частоте запросов документы можно дополнительно сохранять в столбце типа xml и индексировать именно его, а для возврата точных копий документа использовать столбец [n]varchar(max).

XML-столбец может быть столбцом, вычисляемым на основе столбца [n]varchar(max). Однако для вычисляемого XML-столбца, а также для столбцов типов [n]varchar(max) или varbinary(max) нельзя создать XML-индекс.

Технология XML-представлений

Определив соответствие между XML-схемами и таблицами базы данных, можно создать «XML-представление» хранимых данных. Чтобы заполнить базовые таблицы при помощи XML-представления, можно использовать операцию массовой загрузки XML-данных. Запрашивать XML-данные можно при помощи технологии XPath версии 1.0, при этом запрос преобразуется в SQL-запросы таблиц. Обновления также распространяются на эти таблицы.

Эта технология полезна в следующих ситуациях:

  • требуется реализовать ориентированную на XML модель программирования, используя XML-представления существующих реляционных данных;

  • есть XSD-схема или XDR-схема XML-данных, которую, возможно, предоставила внешняя партнерская организация;

  • порядок данных не важен, данные таблиц нерекурсивны или максимальная глубина рекурсии не известна заранее;

  • требуется запрашивать и изменять данные посредством XML-представления с использованием технологии XPath версии 1.0;

  • требуется выполнять массовую загрузку XML-данных и распределять их между базовыми таблицами с использованием XML-представления.

Примерами данных, отвечающих этим условиям, могут служить реляционные данные, предоставляемые веб-службам и средствам обмена данными в форме XML, а также XML-данные с фиксированной схемой. Дополнительные сведения см. в библиотеке MSDN Online.

Пример: моделирование данных с использованием аннотированной XML-схемы (AXSD)

Предположим, что есть реляционные данные (например, сведения о заказчиках, заказах и товарах), которые нужно обрабатывать как XML. Определите в этом случае XML-представление, применив схему AXSD к реляционным данным. XML-представление позволяет выполнять массовую загрузку XML-данных в таблицы, а также запрашивать и обновлять реляционные данные. Эта модель особенно эффективна, если требуется обмениваться данными, содержащими XML-разметку, с другими приложениями без приостановления работы приложений SQL.

Комбинированная модель

Довольно часто для моделирования данных лучше всего подходит комбинация реляционных столбцов и столбцов типа xml . Некоторые значения XML-данных можно хранить в реляционных столбцах, а остальные или все значения XML — в XML-столбце. Это может привести к повышению производительности за счет более полного контроля над индексами, созданными для реляционных столбцов, и параметрами блокировки.

Значения, которые следует хранить в реляционных столбцах, зависят от рабочей нагрузки. Например, если извлекаются все XML-значения при использовании выражения пути /Customer/@CustId, то, выполнив продвижение значения атрибута CustId до реляционного столбца и осуществив его индексацию, можно ускорить обработку запросов. С другой стороны, если XML-данные чрезмерно распределить по реляционным столбцам без дублирования, составление данных в единое целое может оказаться слишком дорогим.

В случае высокоструктурированных XML-данных, таких как содержимое таблицы, преобразованное в XML, можно сопоставить все значения с реляционными столбцами и, возможно, использовать технологию XML-представлений.

Гранулярность XML-данных

Гранулярность XML-данных, хранимых в XML-столбце, очень важна при блокировках и, в меньшей степени, при обновлениях. В SQL Server используются одинаковые механизмы блокировки для XML-данных и данных, отличных от XML. Таким образом, при блокировке на уровне строки блокируются все экземпляры XML в строке. Если гранулярность велика, блокировка крупных экземпляров XML для выполнения обновлений сокращает производительность системы в многопользовательской среде. С другой стороны, при чрезмерной декомпозиции утрачивается инкапсуляция объекта и возрастают накладные расходы, связанные с воссозданием данных.

Чтобы создать эффективную систему, нужно достичь баланса между требованиями к моделированию данных и характеристиками блокировок и обновлений. Однако в SQL Server размер хранимых экземпляров XML имеет не такое большое значение.

Например, обновления экземпляра XML выполняются с использованием нового способа частичного обновления больших двоичных объектов (BLOB) и индексов, при котором существующий хранимый экземпляр XML сравнивается с его обновленной версией. При частичном обновлении большого двоичного объекта выполняется разностное сравнение двух экземпляров XML и обновляются только различающиеся данные. При частичном обновлении индекса изменяются только те строки XML-индекса, которые этого требуют.

Ограничения типа данных xml

Обратите внимание, что на тип данных xml накладываются следующие ограничения.

  • Размер хранимого представления экземпляра типа данных xml не должен превышать 2 ГБ.

  • Данный тип не может быть использован в качестве подтипа экземпляра sql_variant .

  • Приведение или преобразование к типам text или ntext не поддерживается. Вместо этого используются типы varchar(max) или nvarchar(max).

  • Сравнение и сортировка не допускаются. Это значит, что данные типа xml не могут использоваться в предложении GROUP BY.

  • Не может использоваться в качестве параметров любых скалярных встроенных функций, кроме ISNULL, COALESCE и DATALENGTH.

  • Не может использоваться как ключевой столбец индекса. Однако может включаться в виде данных в кластеризованный индекс или явно добавляться в некластеризованный индекс при его создании с помощью ключевого слова INCLUDE.

См. также

Основные понятия

Примеры массового импорта и экспорта XML-документов (SQL Server)