Выборочный XML-индекс (SXI)

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

  • Для повышения производительности запросов к XML-данным, хранящимся в SQL Server.

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

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

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

Функция селективного XML-индекса позволяет повышать только некоторые пути из XML-документов в индекс. Во время создания индекса производится вычисление этих путей, а узлы, на которые они указывают, разделяются и сохраняются в реляционной таблице в SQL Server. Эта функция использует эффективный алгоритм сопоставления, разработанный Microsoft Research в сотрудничестве с группой разработчиков SQL Server. Этот алгоритм сопоставляет узлы XML с одной реляционной таблицей и достигает исключительной производительности при использовании небольшого пространства для хранения.

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

ПримечаниеПримечание

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

В этом разделе

  1. Преимущества селективных XML-индексов

  2. Селективные XML-индексы и первичные XML-индексы

  3. Простой пример селективного XML-индекса

  4. Поддерживаемые функции, предварительные требования и ограничения

    1. Поддерживаемые функции XML

    2. Неподдерживаемые функции XML

    3. Предварительные требования

    4. Ограничения

  5. Связанные задачи

Преимущества селективных XML-индексов

Селективные XML-индексы дают следующие преимущества:

  1. Значительное улучшение производительности запросов к типу данных XML для типичных нагрузок по запросам.

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

  3. Сниженные расходы на обслуживание индекса по сравнению с обычными XML-индексами.

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

[В начало]

Селективные XML-индексы и первичные XML-индексы

Важное примечаниеВажно!

Создание селективного XML-индекса вместо обычного XML-индекса в большинстве случаев приводит к повышению производительности и более эффективному использованию хранилища.

Однако селективный XML-индекс не рекомендуется использовать при наличии следующих условий.

  • Необходимо сопоставить большое число путей узлов.

  • Поддерживаются запросы неизвестных элементов или элементов в неизвестном месте структуры документа.

[В начало]

Простой пример селективного XML-индекса

Рассмотрим следующий фрагмент XML как XML-документ в таблице из приблизительно 500 000 строк.

<book>
    <created>2004-03-01</created> 
    <authors>Various</authors>
    <subjects>
        <subject>English wit and humor -- Periodicals</subject>
        <subject>AP</subject> 
    </subjects>
    <title>Punch, or the London Charivari, Volume 156, April 2, 1919</title>
    <id>etext11617</id>
</book>

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

Если запросы к данным выполняются только по путям /book/title и /book/subjects, вы можете создать следующий селективный XML-индекс.

CREATE SELECTIVE XML INDEX SXI_index
ON Tbl(xmlcol)
FOR 
(
    pathTitle = '/book/title/text()' AS XQUERY 'xs:string', 
    pathAuthors = '/book/authors' AS XQUERY 'node()',
    pathId = '/book/id' AS SQL NVARCHAR(100)
)

Предыдущая инструкция — это хороший пример синтаксиса CREATE, используемого при создании селективного XML-индекса. В инструкции CREATE указывается имя индекса и определяется таблица и XML-столбец для индексирования. Затем передаются пути для индексирования. Путь состоит из 3 частей:

  1. имя, однозначно определяющее путь;

  2. выражение XQuery, описывающее путь;

  3. необязательные указания по оптимизации.

Дополнительные сведения об этих элементах см. в разделе Связанные задачи.

[В начало]

Поддерживаемые функции, предварительные требования и ограничения

Поддерживаемые функции XML

Селективные XML-индексы поддерживают XQuery, поддерживаемые SQL Server в методах exist(), value() и nodes().

  • Для методов exist(), value() и nodes() селективные XML-индексы содержат достаточно данных для преобразования всего выражения.

  • Для методов query() и modify() селективные XML-индексы можно использовать только для фильтрации узлов.

  • Для метода query() селективные XML-индексы не используются для получения результатов.

  • Для метода modify() селективные XML-индексы не используются для обновления XML-документов.

[В начало]

Неподдерживаемые функции XML

Селективные XML-индексы не поддерживают следующие функции, поддерживаемые в реализации SQL Server XML:

  • Индексирование узлов со сложными типами XS: типами объединений, типами последовательностей и типами списков.

  • Индексирование узлов с двоичными типами XS, например base64Binary и hexBinary.

  • Указание узлов для индексирования с выражениями Xpath, которые содержат символ-шаблон * в конце. Например, /a/b/c/*, /a//b/* или /a/b/*:c.

  • Индексирование любых осей, отличных от осей дочерних элементов, атрибутов или объектов-потомков. Вариант //<step> допускается как исключение.

  • Индексирование инструкций и комментариев по обработке XML.

  • Указание и получение идентификатора для узла с помощью функции id().

[В начало]

Предварительные требования

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

  • Кластеризованный индекс должен существовать для первичного ключа таблицы пользователя.

  • Первичный ключ пользовательской таблицы ограничивается размером в 128 байт при использовании с селективными XML-индексами.

  • Ключ кластеризации пользовательской таблицы имеет ограничение в 15 столбцов при использовании с селективными XML-индексами.

[В начало]

Ограничения

Общие требования и ограничения

  • Каждый селективный XML-индекс может быть создан только для одного XML-столбца. Нельзя создать селективный XML-индекс для неселективного столбца XML. Каждый XML-столбец в таблице может иметь только один селективный XML-индекс. Каждая таблица может иметь до 249 селективных XML-индексов.

Ограничения для поддерживаемых объектов

Нельзя создавать селективные XML-индексы для следующих объектов:

  • XML-столбцы в представлении.

  • Возвращающая табличное значение переменная с XML-столбцами.

  • Переменные типа XML.

  • Вычисляемые XML-столбцы.

  • XML-столбец с глубиной более чем в 128 вложенных узлов.

Ограничения, относящиеся к хранению

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

Максимальное количество столбцов со значениями, отличными от NULL, поддерживаемое в любой заданной строке, зависит от размера данных в столбцах.

  • В лучшем случае поддерживается 1024 столбцов со значениями, отличными от NULL, если все столбцы имеют тип bit.

  • В худшем случае поддерживается только 236 столбцов со значениями, отличными от NULL, если все столбцы являются большими объектами типа varchar.

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

Селективные XML-индексы перестраиваются при создании и изменении индекса при помощи инструкций CREATE и ALTER.

При создании или изменении селективного XML-индекса при помощи инструкций CREATE и ALTER оно перестраивается в однопотоковом режиме «вне сети». Часто инструкции ALTER отрицательно влияют на производительность запросов к индексированным XML-документам.

Прочие ограничения

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

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

[В начало]

Связанные задачи

Задача

Раздел

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

Задайте путь и указания по оптимизации для селективных XML-индексов

Создание, изменение и удаление селективного XML-индекса.

Создание, изменение и удаление селективных XML-индексов

Создание, изменение и удаление вторичного селективного XML-индекса.

Создание, изменение и удаление вторичных селективных XML-индексов

[В начало]