Crear índices XMLCreate XML Indexes

En este tema se describe cómo crear índices XML principales y secundarios.This topic describes how to create primary and secondary XML indexes.

Crear un índice XML principalCreating a Primary XML Index

Para crear un índice XML principal, use la instrucción DDL CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL.To create a primary XML index, use the CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL DDL statement. Los índices XML no admiten todas las opciones que están disponibles para índices que no son XML.Not all options available for non-XML indexes are supported on XML indexes.

Cuando cree un índice XML, tenga en cuenta lo siguiente:Note the following when you are creating an XML index:

  • Para crear un índice XML principal, la tabla que contiene la columna XML que se va a indizar, llamada tabla base, debe tener un índice clúster en la clave principal.To create a primary XML index, the table that contains the XML column being indexed, called the base table, must have a clustered index on the primary key. Esto garantiza que si la tabla base tiene particiones, se pueden crear particiones en el índice XML principal usando el mismo esquema y función de partición.This makes sure that if the base table is partitioned, the primary XML index can be partitioned by using the same partitioning scheme and partitioning function.

  • Si ya existe un índice XML, la clave principal agrupada de la tabla no puede modificarse.If an XML index exists, the clustered, primary key of the table cannot be modified. Antes de modificar la clave principal, deberá quitar todos los índices XML de la tabla.You will have to drop all XML indexes on the table before modifying the primary key.

  • Un índice XML principal puede crearse en una sola columna de tipo xml .A primary XML index can be created on a single xml type column. No es posible crear ningún otro índice con una columna de tipo XML como columna de clave.You cannot create any other type of index with the XML type column as a key column. Pero puede incluir la columna de tipo L xml en un índice que no sea XML.However, you can include the xml L type column in a non-XML index. Cada columna de tipo xml de una tabla puede tener su propio índice XML principal.Each xml type column in a table can have its own primary XML index. No obstante, solo se admite un índice XML principal por cada columna de tipo xml .However, only one primary XML index per xml type column is permitted.

  • Los índices XML existen en el mismo espacio de nombres que los índices que no son XML.XML indexes exist in the same namespace as non-XML indexes. Por tanto, no puede tener un índice XML y otro que no lo sea en la misma tabla y con el mismo nombre.Therefore, you cannot have an XML index and a non-XML index on the same table with the same name.

  • Las opciones IGNORE_DUP_KEY y ONLINE siempre se establecen en OFF para los índices XML.IGNORE_DUP_KEY and ONLINE options of are always set to OFF for XML indexes. Puede especificar estas opciones con el valor OFF.You can specify these options with a value of OFF.

  • La información de partición o grupo de archivos de la tabla de usuarios se aplica al índice XML.The filegroup or partitioning information of the user table is applied to the XML index. Los usuarios no pueden especificar dicha información por separado en un índice XML.Users cannot specify these separately on an XML index.

  • La opción de índice DROP_EXISTING permite quitar un índice XML principal y crear uno nuevo o efectuar la misma operación con un índice XML secundario.The DROP_EXISTING index option can drop a primary XML index and create a new primary XML index, or drop a secondary XML index and create a new secondary XML index. No obstante, esta opción no puede quitar un índice XML secundario para crear un índice XML principal ni viceversa.However, this option cannot drop a secondary XML index to create a new primary XML index or vice versa.

  • Los nombres de índice XML principal tienen las mismas restricciones que los nombres de vista.Primary XML index names have the same restrictions as view names.

    No se puede crear un índice XML en un columna de tipo xml de una vista, en una variable con el valor table con columnas de tipo xml ni en variables de tipo xml .You cannot create an XML index on an xml type column in a view, on a table valued variable with xml type columns, or xml type variables.

  • Para cambiar una columna de tipo xml de XML con tipo a XML sin tipo, o viceversa, con la opción ALTER TABLE ALTER COLUMN, la columna no debe incluir ningún índice XML.To change an xml type column from untyped to typed XML, or vice versa, by using the ALTER TABLE ALTER COLUMN option, no XML index on the column should exist. Si existe alguno, debe quitarse antes de intentar cambiar el tipo de columna.If one does exist, it must be dropped before the column type change is tried.

  • Al crear un índice XML, la opción ARITHABORT debe configurarse en ON.The option ARITHABORT must be set to ON when an XML index is created. Para consultar, insertar, eliminar o actualizar valores en la columna XML usando métodos de tipo de datos XML, debe establecerse la misma opción en la conexión.To query, insert, delete, or update values in the XML column using XML data type methods, the same option must be set on the connection. De lo contrario, los métodos de tipo de datos XML darán error.If it is not, the XML data type methods will fail.

    Nota

    Las vistas de catálogo incluyen información acerca de los índices XML.Information about an XML index can be found in catalog views. Pero no se admite sp_helpindex .However, sp_helpindex is not supported. Los ejemplos que se ofrecen más adelante en este tema muestran cómo consultar las vistas de catálogo para encontrar información de índices XML.Examples provided later in this topic show how to query the catalog views to find XML index information.

    Al crear o volver a crear un índice XML principal o una columna de tipo de datos XML que contiene valores de los tipos de esquema XML xs:date o xs:dateTime (o cualquier subtipo de estos tipos) que tengan un año de menos de 1, se producirá un error en la creación del índice en SQL Server 2008SQL Server 2008 y versiones posteriores.When creating or recreating a primary XML index on an XML data type column that contains values of the XML Schema types xs:date or xs:dateTime (or any subtypes of these types) that have a year of less than 1, the index creation will fail in SQL Server 2008SQL Server 2008 and later versions. Resultado deSQL Server 2005 permitía estos valores, por lo que este problema se puede producir al crear índices en una base de datos generada en Resultado deSQL Server 2005.. Para obtener más información, vea Comparar XML con tipo y XML sin tipo.For more information, see Compare Typed XML to Untyped XML.

Ejemplo: Crear un índice XML principalExample: Creating a Primary XML Index

En la mayoría de los ejemplos, se utiliza la tabla T (pk INT PRIMARY KEY, xCol XML) con una columna XML sin tipo.Table T (pk INT PRIMARY KEY, xCol XML) with an untyped XML column is used in most of the examples. Se pueden ampliar a XML con tipo de forma directa.These can be extended to typed XML in a straightforward way. Para simplificar el trabajo, las consultas se describen para instancias de datos XML como se indica a continuación:For simplicity, queries are described for XML data instances as shown in the following:

<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>  

La siguiente instrucción crea un índice XML, denominado idx_xCol, en la columna XML xCol de la tabla T:The following statement creates an XML index, called idx_xCol, on the XML column xCol of table T:

CREATE PRIMARY XML INDEX idx_xCol on T (xCol)  

Crear un índice XML secundarioCreating a Secondary XML Index

Use la instrucción DDL CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL para crear índices XML secundarios y especificar el tipo de índice XML secundario que quiere.Use the CREATE INDEX (Transact-SQL) Transact-SQLTransact-SQL DDL statement to create secondary XML indexes and specify the type of the secondary XML index that you want.

Cuando cree índices XML secundarios, tenga en cuenta lo siguiente:Note the following when you are creating secondary XML indexes:

  • Todas las opciones de indización que se aplican a un índice no clúster, salvo IGNORE_DUP_KEY y ONLINE, se admiten para los índices XML secundarios.All indexing options that apply to a nonclustered index, except IGNORE_DUP_KEY and ONLINE, are permitted on secondary XML indexes. Las dos opciones deben establecerse siempre en OFF para los índices XML secundarios.The two options must always be set to OFF for secondary XML indexes.

  • Los índices secundarios se dividen en particiones al igual que el índice XML principal.The secondary indexes are partitioned just like the primary XML index.

  • DROP_EXISTING permite quitar un índice secundario de la tabla de usuario y crear otro en la misma tabla.DROP_EXISTING can drop a secondary index on the user table and create another secondary index on the user table.

    Puede consultar la vista de catálogo sys.xml_indexes para recuperar información de índices XML.You can query the sys.xml_indexes catalog view to retrieve XML index information. Tenga en cuenta que la columna secondary_type_desc de la vista de catálogo sys.xml_indexes proporciona el tipo de índice secundario:Note that the secondary_type_desc column in the sys.xml_indexes catalog view provides the type of secondary index:

SELECT  *   
FROM    sys.xml_indexes;  

Los valores que se devuelven en la columna secondary_type_desc pueden ser NULL, PATH, VALUE o PROPERTY.The values returned in the secondary_type_desc column can be NULL, PATH, VALUE, or PROPERTY. El valor devuelto para el índice XML principal es NULL.For the primary XML index, the value returned is NULL.

Ejemplo: Crear índices XML secundariosExample: Creating Secondary XML Indexes

El ejemplo siguiente muestra cómo crear índices XML secundarios.The following example illustrates how secondary XML indexes are created. En el ejemplo también se muestra información acerca de los índices XML que ha creado.The example also shows information about the XML indexes that you created.

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  

Puede consultar sys.xml_indexes para recuperar información de índices XML.You can query the sys.xml_indexes to retrieve XML indexes information. La columna secondary_type_desc proporciona el tipo de índice secundario.The secondary_type_desc column provides the secondary index type.

SELECT  *   
FROM    sys.xml_indexes;  

También puede consultar la vista de catálogo para obtener información de índice.You can also query the catalog view for index information.

SELECT *  
FROM sys.xml_indexes  
WHERE object_id = object_id('T');  

Puede agregar datos de ejemplo y, a continuación, revisar la información de índices XML.You can add sample data and then review the XML index information.

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  

Vea tambiénSee Also

Índices XML (SQL Server) XML Indexes (SQL Server)
Datos XML (SQL Server) XML Data (SQL Server)