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


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

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

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

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

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

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

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

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

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

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

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

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

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

Выборочные XML-индексы и первичные XML-индексы

Внимание

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

Однако выборочный XML-индекс не рекомендуется, если одно из следующих условий имеет значение true:

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

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

Пример выборочного 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-индексы не поддерживают следующие функции, поддерживаемые в реализации XML-кода SQL Server:

  • Индексирование узлов со сложными типами 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-индексы внутренним образом используют от одного до четырех столбцов для каждого индексированного пути узла. Общее количество доступных для индексации узлов лежит в диапазоне от 60 до нескольких сотен узлов и зависит от фактического размера данных в индексированных путях.

  • В худшем случае, если некоторые или все узлы сопоставлены с помощью // в определении пути узла, максимальное количество индексируемых узлов равно 60.

  • В лучшем случае, если узлы сопоставлены без использования // в определении пути узла, максимальное количество индексируемых узлов равно 200.

Выборочные XML-индексы перестраиваются при создании или изменении индекса

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

Другие ограничения

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

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

См. также