Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureБаза данных SQL в Microsoft Fabric
В этой статье описывается создание первичных и вторичных XML-индексов.
Создание первичного XML-индекса
Чтобы создать первичный XML-индекс, используйте инструкцию CREATE INDEX (Transact-SQL)Transact-SQL DDL. Для XML-индексов поддерживаются не все параметры, доступные для обычных индексов.
Обратите внимание на следующее при создании XML-индекса:
Для создания первичного XML-индекса таблица, содержащая индексируемый XML-столбец и называемая базовой таблицей, должна иметь кластеризованный индекс первичного ключа. Этот кластеризованный индекс гарантирует, что если базовая таблица секционирована, первичный XML-индекс можно секционировать с помощью той же схемы секционирования и функции секционирования.
Если XML-индекс существует, кластеризованный первичный ключ таблицы нельзя изменить. Перед изменением первичного ключа необходимо удалить все XML-индексы в таблице.
Первичный XML-индекс можно создать только для столбца типа данных xml . Невозможно создать другой тип индекса с столбцом типа XML в качестве ключевого столбца. Однако столбец типа XML можно включить в индекс, который не является XML. Каждый столбец типа xml в таблице может иметь собственный первичный XML-индекс. Однако для столбца типа xml допустим только один первичный XML-индекс.
XML-индексы существуют в том же пространстве имен, что и не-XML индексы. Таким образом, нельзя иметь XML-индекс и не-XML индекс в одной и той же таблице с одинаковым именем.
Параметры IGNORE_DUP_KEY и ONLINE для XML-индексов всегда установлены в значение OFF. Можно указывать эти параметры со значением OFF.
Файловая группа или сведения о секционировании таблицы пользователя применяются к XML-индексу и не могут быть указаны отдельно.
Параметр DROP_EXISTING может использоваться для удаления и создания нового первичного XML-индекса или для удаления и создания нового вторичного XML-индекса. Однако этот параметр не может удалить вторичный XML-индекс, чтобы создать новый первичный XML-индекс или наоборот.
На имена первичных XML-индексов накладываются те же ограничения, что и на имена представлений.
Невозможно создать XML-индекс в столбце типа xml в представлении, в переменной с табличным значением с столбцами типа xml, или переменных типа xml.
Для изменения столбца типа xml с помощью параметра ALTER TABLE ALTER COLUMN с нетипизированного на типизированный XML (или наоборот) для этого столбца не должно быть определено никаких XML-индексов. Если такой индекс существует, он должен быть сначала удален, прежде чем пытаться изменить тип столбца.
При создании XML-индекса параметр ARITHABORT должен быть установлен в значение ON. Чтобы запрашивать, вставлять, удалять или обновлять значения в XML-столбце с помощью методов типа данных XML , то же самое необходимо задать в соединении. Если это не выполняется, методы типа данных XML дадут сбой.
Примечание.
Сведения об XML-индексе доступны через представления каталога, Однако sp_helpindex не поддерживается. Ниже в этом подразделе содержатся примеры, которые демонстрируют, какие следует выполнить запросы к представлениям каталога, чтобы получить сведения об XML-индексе.
При создании или повторном создании первичного XML-индекса в столбце типа данных XML , содержащего значения типов xs:date схемы XML или xs:dateTime (или любых подтипов этих типов), имеющих год менее 1, создание индекса завершится ошибкой в SQL Server 2008 (10.0.x) и более поздних версиях. SQL Server 2005 (9.x) допускает эти значения, поэтому эта проблема может возникнуть при создании индексов в базе данных, созданной в SQL Server 2005 (9.x). Дополнительные сведения см. в статье Сравнение типизированного и нетипизированного XML.
Пример. Создание первичного XML-индекса
Таблица T (pk INT PRIMARY KEY, xCol XML) с нетипизированным XML-столбцом используется в большинстве примеров. Этот пример можно расширить до типизированного XML простым способом. Для простоты запросы описываются для экземпляров XML-данных, как показано в следующем примере:
<book genre="security" publicationdate="2002" ISBN="0-7356-1588-2">
<title>Writing Secure Code</title>
<author>
<first-name>Michael</first-name>
<last-name>Howard</last-name>
</author>
<author>
<first-name>David</first-name>
<last-name>LeBlanc</last-name>
</author>
<price>39.99</price>
</book>
Следующая инструкция создает XML-индекс, называемый idx_xCol, на XML-столбце xCol таблицы T.
CREATE PRIMARY XML INDEX idx_xCol on T (xCol)
Создание вторичного XML-индекса
Используйте инструкцию CREATE INDEX (Transact-SQL)Transact-SQL DDL, чтобы создать вторичные XML-индексы и указать нужный тип вторичного XML-индекса.
Обратите внимание на следующее при создании вторичных XML-индексов:
Для вторичных XML-индексов допустимы все параметры, применимые к некластеризованным индексам, за исключением параметров IGNORE_DUP_KEY и ONLINE. Для вторичных XML-индексов эти два параметра должны всегда устанавливаться в OFF.
Вторичные индексы секционируются так же, как и первичный XML-индекс.
Параметр DROP_EXISTING позволяет удалить вторичный индекс для пользовательской таблицы и создать другой вторичный индекс для той же таблицы.
Для получения сведений об XML-индексе можно выполнить запрос к представлению каталога sys.xml_indexes . Столбец secondary_type_desc в представлении каталога sys.xml_indexes предоставляет тип вторичного индекса:
SELECT *
FROM sys.xml_indexes;
Значения, возвращаемые в столбце secondary_type_desc , могут быть NULL, PATH, VALUE или PROPERTY. Для первичного XML-индекса всегда возвращается значение NULL.
Пример. Создание вторичных XML-индексов
В следующем примере иллюстрируется создание вторичных XML-индексов. Здесь также выводятся сведения о созданных XML-индексах.
CREATE TABLE T (Col1 INT PRIMARY KEY, XmlCol XML);
GO
-- Create primary index.
CREATE PRIMARY XML INDEX PIdx_T_XmlCol
ON T(XmlCol);
GO
-- Create secondary indexes (PATH, VALUE, PROPERTY).
CREATE XML INDEX PIdx_T_XmlCol_PATH ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PATH;
GO
CREATE XML INDEX PIdx_T_XmlCol_VALUE ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR VALUE;
GO
CREATE XML INDEX PIdx_T_XmlCol_PROPERTY ON T(XmlCol)
USING XML INDEX PIdx_T_XmlCol
FOR PROPERTY;
GO
Вы можете запросить sys.xml_indexes представление каталога, чтобы получить сведения о XML-индексах. Столбец secondary_type_desc содержит тип вторичного индекса.
SELECT *
FROM sys.xml_indexes;
Для получения сведений об индексе можно также выполнить запрос к представлению каталога:
SELECT *
FROM sys.xml_indexes
WHERE object_id = object_id('T');
Можно добавить какие-либо данные, а затем просмотреть сведения об XML-индексе.
INSERT INTO T VALUES (1,
'<doc id="123">
<sections>
<section num="2">
<heading>Background</heading>
</section>
<section num="3">
<heading>Sort</heading>
</section>
<section num="4">
<heading>Search</heading>
</section>
</sections>
</doc>');
GO
-- Check XML index information.
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, NULL, 'DETAILED');
GO
-- Space usage of primary XML index
DECLARE @index_id int;
SELECT @index_id = i.index_id
FROM sys.xml_indexes i
WHERE i.name = 'PIdx_T_XmlCol' and object_name(i.object_id) = 'T';
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO
--- Space usage of secondary XML index (for example PATH secondary index) PIdx_T_XmlCol_PATH
DECLARE @index_id int;
SELECT @index_id = i.index_id
FROM sys.xml_indexes i
WHERE i.name = 'PIdx_T_XmlCol_PATH' and object_name(i.object_id) = 'T';
SELECT *
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T') , @index_id, DEFAULT, 'DETAILED');
GO
-- Space usage of all secondary XML indexes for a particular table
SELECT i.name, object_name(i.object_id), stats.*
FROM sys.dm_db_index_physical_stats (db_id(), object_id('T'), NULL, DEFAULT, 'DETAILED') stats
JOIN sys.xml_indexes i ON (stats.object_id = i.object_id and stats.index_id = i.index_id)
WHERE secondary_type is not null;
-- Drop secondary indexes.
DROP INDEX PIdx_T_XmlCol_PATH ON T;
GO
DROP INDEX PIdx_T_XmlCol_VALUE ON T;
GO
DROP INDEX PIdx_T_XmlCol_PROPERTY ON T;
GO
-- Drop primary index.
DROP INDEX PIdx_T_XmlCol ON T;
-- Drop table T.
DROP TABLE T;
GO