Хранение XML-типа

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

XML-тип сохраняется как большой объект (lob - large object) в бинарном формате, структура которого неизвестна, но точно можно сказать, что она линейна. Т.е. сохраняется относительный порядок узлов в документе – атрибуты следуют после элемента, к которому они принадлежат, дочерние элементы следуют после атрибутов, и последующие элементы (элементы того же уровня) – после дочерних элементов.

Для осуществления запроса XQuery SQL Server каждый раз выполняет преобразование этой линейной структуры в реляционную – в таблицу узлов (node table). Таблица узлов более формализована и понятна, однако занимает в несколько раз (даже на порядки) больше места. Любой запрос XQuery трансформируется в SQL запрос к этой таблице.

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

Структура этой таблицы следующая (назначение некоторых полей я придумал сам, потому что разработчики пока не признаются, что эти поля означают):

  • pk1 – значение первичного ключа основной таблицы, где расположено XML-поле.
  • id – идентификатор строки в данной таблице.
  • nid – идентификатор узла.
  • tid – неизвестно.
  • value – значение узла.
  • lvalue – неизвестно.
  • lvaluebin – неизвестно.
  • hid – неизвестно.
  • xsinil – равно ли значение узла NULL.
  • xsitype – тип узла.

Вот собственно и все, что мне удалось раскопать по внутреннему устройству XML-типа.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: