Создание XML-индексов

Применяется к:SQL ServerAzure SQL DatabaseAzure, управляемому экземпляру SQL Azure

В этой статье описывается создание первичных и вторичных 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-индекса в той же таблице с тем же именем.

  • Параметры 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

См. также