Выборочные 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-индексы дают следующие преимущества:
Значительное улучшение производительности запросов к типу данных XML для типичных нагрузок по запросам.
Сниженные требования к хранилищу по сравнению с обычными XML-индексами.
Сниженные расходы на обслуживание индекса по сравнению с обычными XML-индексами.
Нет необходимости обновлять приложения для получения пользы от селективных 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 частей:
имя, однозначно определяющее путь;
выражение XQuery, описывающее путь;
необязательные указания по оптимизации.
Дополнительные сведения об этих элементах см. в разделе Связанные задачи.
Поддерживаемые функции, предварительные требования и ограничения
Поддерживаемые функции 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-индексы не поддерживаются в помощнике по настройке базы данных.