Мне было очень интересно узнать, каким образом 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-типа.