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

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Es posible crear índices XML en columnas del tipo de datos xml .XML indexes can be created on xml data type columns. Se indizan todas las etiquetas, los valores y las rutas de acceso de las instancias XML de la columna y se mejora el rendimiento de las consultas.They index all tags, values and paths over the XML instances in the column and benefit query performance. Un índice XML puede afectar positivamente a una aplicación en estas situaciones:Your application may benefit from an XML index in the following situations:

  • Las consultas en columnas XML son habituales en su carga de trabajo.Queries on XML columns are common in your workload. Es preciso considerar el costo de mantenimiento del índice XML durante la modificación de datos.XML index maintenance cost during data modification must be considered.

  • Los valores XML son relativamente grandes y las partes recuperadas son relativamente pequeñas.Your XML values are relatively large and the retrieved parts are relatively small. La generación del índice evita tener que analizar todo el conjunto de datos en tiempo de ejecución y favorece las búsquedas basadas en índices que permiten un procesamiento más eficiente de las consultas.Building the index avoids parsing the whole data at run time and benefits index lookups for efficient query processing.

Los índices XML se dividen en las categorías siguientes:XML indexes fall into the following categories:

  • Índice XML principalPrimary XML index

  • Índice XML secundarioSecondary XML index

El primer índice de la columna de tipo xml debe ser el índice XML principal.The first index on the xml type column must be the primary XML index. Con el índice XML principal, se admiten los siguientes tipos de índices secundarios: PATH, VALUE y PROPERTY.Using the primary XML index, the following types of secondary indexes are supported: PATH, VALUE, and PROPERTY. Dependiendo del tipo de consulta, los índices secundarios pueden contribuir a mejorar el rendimiento.Depending on the type of queries, these secondary indexes might help improve query performance.

Nota

No puede crear o modificar un índice XML si las opciones de base de datos no están establecidas correctamente para trabajar con el tipo de datos xml .You cannot create or modify an XML index unless the database options are set correctly for working with the xml data type. Para obtener más información, vea Usar la búsqueda de texto completo con columnas XML.For more information, see Use Full-Text Search with XML Columns.

Las instancias XML se almacenan en las columnas de tipo xml como objetos binarios grandes (BLOB).XML instances are stored in xml type columns as large binary objects (BLOBs). Estas instancias XML pueden ser grandes, y la representación binaria almacenada de instancias de datos de tipo xml puede tener un tamaño de hasta 2 GB.These XML instances can be large, and the stored binary representation of xml data type instances can be up to 2 GB. Sin ningún índice, estos objetos binarios grandes se dividen en tiempo de ejecución para evaluar una consulta.Without an index, these binary large objects are shredded at run time to evaluate a query. Este proceso de división puede resultar lento.This shredding can be time-consuming. Por ejemplo, considere la siguiente consulta:For example, consider the following query:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")  
  
SELECT CatalogDescription.query('  
  /PD:ProductDescription/PD:Summary  
') as Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1  

Para seleccionar instancias XML que cumplan la condición de la cláusula WHERE , el objeto binario grande (BLOB) XML de cada fila de la tabla Production.ProductModel se divide en tiempo de ejecución.To select the XML instances that satisfy the condition in the WHERE clause, the XML binary large object (BLOB) in each row of table Production.ProductModel is shredded at run time. A continuación, se evalúa la expresión (/PD:ProductDescription/@ProductModelID[.="19"]) en el método exist() .Then, the expression (/PD:ProductDescription/@ProductModelID[.="19"]) in the exist() method is evaluated. Esta división en tiempo de ejecución puede ser costosa, en función del tamaño y el número de instancias almacenadas en la columna.This run-time shredding can be costly, depending on the size and number of instances stored in the column.

Si las consultas de objetos binarios grandes (BLOB) XML son frecuentes en su entorno de aplicación, será útil indexar las columnas de tipo xml .If querying XML binary large objects (BLOBs) is common in your application environment, it helps to index the xml type columns. No obstante, el mantenimiento del índice durante la modificación de datos lleva un costo asociado.However, there is a cost associated with maintaining the index during data modification.

Índice XML principalPrimary XML Index

El índice XML principal incluye todas las etiquetas, los valores y las rutas de acceso de las instancias XML de una columna XML.The primary XML index indexes all tags, values, and paths within the XML instances in an XML column. Para crear un índice XML principal, la tabla que contiene la columna XML, debe tener un índice clúster en la clave principal de la tabla.To create a primary XML index, the table in which the XML column occurs must have a clustered index on the primary key of the table. SQL ServerSQL Server utiliza esta clave principal para correlacionar las filas del índice XML principal con las filas de la tabla que contiene la columna XML.uses this primary key to correlate rows in the primary XML index with rows in the table that contains the XML column.

El índice XML principal es una representación dividida y persistente de los objetos binarios grandes (BLOB) XML de la columna de tipo de datos xml .The primary XML index is a shredded and persisted representation of the XML BLOBs in the xml data type column. Para cada BLOB XML de la columna, el índice crea varias filas de datos.For each XML binary large object (BLOB) in the column, the index creates several rows of data. El número de filas del índice es prácticamente igual al número de nodos del BLOB XML.The number of rows in the index is approximately equal to the number of nodes in the XML binary large object. Cuando una consulta recupera la instancia XML completa, SQL ServerSQL Server proporciona la instancia a partir de la columna XML.When a query retrieves the full XML instance, SQL ServerSQL Server provides the instance from the XML column. Las consultas dentro de instancias XML usan el índice XML principal y pueden devolver valores escalares o subárboles XML utilizando el propio índice.Queries within XML instances use the primary XML index, and can return scalar values or XML subtrees by using the index itself.

Cada fila almacena la siguiente información acerca del nodo:Each row stores the following node information:

  • Nombre de etiqueta (p. ej., un nombre de elemento o atributo).Tag name such as an element or attribute name.

  • Valor del nodo.Node value.

  • Tipo de nodo (p. ej., un nodo de elemento, de atributo o de texto).Node type such as an element node, attribute node, or text node.

  • Información del pedido de documento, representado mediante un identificador de nodo interno.Document order information, represented by an internal node identifier.

  • Ruta de acceso desde cada nodo a la raíz del árbol XML.Path from each node to the root of the XML tree. La consulta busca expresiones de ruta en esta columna.This column is searched for path expressions in the query.

  • Clave principal de la tabla base.Primary key of the base table. La clave principal de la tabla base está duplicada en el índice XML principal para mantener la combinación con la tabla base, y el número máximo de columnas en la clave principal de la tabla base se limita a 15.The primary key of the base table is duplicated in the primary XML index for a back join with the base table, and the maximum number of columns in the primary key of the base table is limited to 15.

Esta información de nodo se utiliza para evaluar y crear resultados XML para una consulta específica.This node information is used to evaluate and construct XML results for a specified query. Con fines de optimización, la información de nombre de etiqueta y tipo de nodo se codifica en forma de valores enteros; la columna Patch utiliza la misma codificación.For optimization purposes, the tag name and the node type information are encoded as integer values, and the Path column uses the same encoding. Asimismo, las rutas de acceso se almacenan en orden inverso para permitir rutas de acceso coincidentes cuando solo se conoce el sufijo de la ruta de acceso.Also, paths are stored in reverse order to allow matching paths when only the path suffix is known. Por ejemplo:For example:

  • //ContactRecord/PhoneNumber , donde solo se conocen los dos últimos pasos.//ContactRecord/PhoneNumber where only the last two steps are known

O BIENOR

  • /Book/*/Title donde el carácter comodín (*) se especifica en mitad de la expresión./Book/*/Title where the wildcard character (*) is specified in the middle of the expression.

El procesador de consultas usa el índice XML principal para las consultas relacionadas con los xml Data Type Methods y devuelve valores escalares o los subárboles XML del propio índice principal.The query processor uses the primary XML index for queries that involve xml Data Type Methods and returns either scalar values or the XML subtrees from the primary index itself. (Este índice almacena toda la información necesaria para volver a construir la instancia XML).(This index stores all the necessary information to reconstruct the XML instance.)

Por ejemplo, la siguiente consulta devuelve información de resumen almacenada en la columna de CatalogDescription tipo xml de la tabla ProductModel.For example, the following query returns summary information stored in the CatalogDescriptionxml type column in the ProductModel table. La consulta devuelve información perteneciente a <Summary> solo para modelos de producto cuya descripción de catálogo también almacena información sobre <Features>.The query returns <Summary> information only for product models whose catalog description also stores the <Features> description.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")SELECT CatalogDescription.query('  /PD:ProductDescription/PD:Summary') as ResultFROM Production.ProductModelWHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1  

En relación con el índice XML principal, en lugar de dividir cada instancia de BLOB XML en la tabla base, las filas del índice que corresponden a cada BLOB XML se examinan secuencialmente para determinar la expresión especificada en el método exist().With regard to the primary XML index, instead of shredding each XML binary large object instance in the base table, the rows in the index that correspond to each XML binary large object are searched sequentially for the expression specified in the exist() method. Si la ruta de acceso se encuentra en la columna Path del índice, el elemento <Summary> y sus subárboles se recuperan a partir del índice XML principal y se convierten en un BLOB XML como resultado del método query().If the path is found in the Path column in the index, the <Summary> element together with its subtrees is retrieved from the primary XML index and converted into an XML binary large object as the result of the query() method.

Tenga en cuenta que el índice XML principal no se utiliza al recuperar una instancia XML completa.Note that the primary XML index is not used when retrieving a full XML instance. Por ejemplo, la consulta siguiente recupera de la tabla la instancia XML completa que describe las instrucciones de fabricación para un modelo determinado de producto.For example, the following query retrieves from the table the whole XML instance that describes the manufacturing instructions for a specific product model.

USE AdventureWorks2012;SELECT InstructionsFROM Production.ProductModel WHERE ProductModelID=7;  

Índices XML secundariosSecondary XML Indexes

Para mejorar los resultados de las búsquedas, pueden crearse índices XML secundarios.To enhance search performance, you can create secondary XML indexes. Antes de crear índices secundarios, debe existir un índice XML principal.A primary XML index must first exist before you can create secondary indexes. A continuación, se indican los tipos existentes:These are the types:

  • Índice XML secundario PATHPATH secondary XML index

  • Índice XML secundario VALUEVALUE secondary XML index

  • Índice XML secundario PROPERTYPROPERTY secondary XML index

A continuación se incluyen algunas directrices para crear uno o varios índices secundarios:Following are some guidelines for creating one or more secondary indexes:

  • Si la carga de trabajo incluye numerosas expresiones de ruta de acceso en las columnas XML, es probable que el índice XML secundario PATH reduzca la carga de trabajo.If your workload uses path expressions significantly on XML columns, the PATH secondary XML index is likely to speed up your workload. El caso más habitual es el uso del método exist() con columnas XML en la cláusula WHERE de Transact-SQL.The most common case is the use of the exist() method on XML columns in the WHERE clause of Transact-SQL.

  • Si la carga de trabajo recupera varios valores a partir de instancias XML individuales empleando expresiones de ruta de acceso, puede resultar útil la agrupación en clústeres de las rutas dentro de cada instancia XML en el índice PROPERTY.If your workload retrieves multiple values from individual XML instances by using path expressions, clustering paths within each XML instance in the PROPERTY index may be helpful. Éste suele ser el caso de una bolsa de propiedades, cuando se capturan las propiedades de un objeto y se conoce el valor de su clave principal.This scenario typically occurs in a property bag scenario when properties of an object are fetched and its primary key value is known.

  • Si la carga de trabajo implica consultar valores dentro de instancias XML sin conocer los nombres de los elementos o atributos que contienen dichos valores, puede ser útil crear el índice VALUE.If your workload involves querying for values within XML instances without knowing the element or attribute names that contain those values, you may want to create the VALUE index. Esto suele ocurrir con búsquedas en ejes descendentes, como //author[last-name="Howard"], en que los elementos <author> pueden aparecer en cualquier nivel de la jerarquía.This typically occurs with descendant axes lookups, such as //author[last-name="Howard"], where <author> elements can occur at any level of the hierarchy. También ocurre en consultas con caracteres comodín, como /book [@* = "novel"], en que la consulta busca elementos <book> que tengan algún atributo con el valor "novel".It also occurs in wildcard queries, such as /book [@* = "novel"], where the query looks for <book> elements that have some attribute having the value "novel".

Índice XML secundario PATHPATH Secondary XML Index

Si sus consultas suelen especificar expresiones de ruta de acceso en columnas de tipo xml , un índice secundario PATH podría acelerar la búsqueda.If your queries generally specify path expressions on xml type columns, a PATH secondary index may be able to speed up the search. Como se indicó anteriormente en este tema, el índice principal resulta útil cuando se realizan consultas que especifican el método exist() en la cláusula WHERE.As described earlier in this topic, the primary index is helpful when you have queries that specify exist() method in the WHERE clause. Si agrega un índice secundario PATH, también puede mejorar los resultados de búsqueda en dichas consultas.If you add a PATH secondary index, you may also improve the search performance in such queries.

Aunque un índice XML principal evita que el BLOB XML se tenga que dividir en tiempo de ejecución, es posible que no proporcione un rendimiento óptimo con consultas basadas en expresiones de ruta de acceso.Although a primary XML index avoids having to shred the XML binary large objects at run time, it may not provide the best performance for queries based on path expressions. Dado que todas las filas del índice XML principal correspondientes a un BLOB XML se examinan secuencialmente para instancias XML de gran tamaño, la búsqueda secuencial puede ser lenta.Because all rows in the primary XML index corresponding to an XML binary large object are searched sequentially for large XML instances, the sequential search may be slow. En este caso, incorporar un índice secundario a los valores de ruta de acceso y de nodo del índice principal puede aumentar significativamente la velocidad de búsqueda del índice.In this case, having a secondary index built on the path values and node values in the primary index can significantly speed up the index search. En el índice secundario PATH, los valores de ruta de acceso y de nodo son columnas de clave que permiten operaciones más eficaces durante la búsqueda de rutas.In the PATH secondary index, the path and node values are key columns that allow for more efficient seeks when searching for paths. El optimizador de consultas puede utilizar el índice PATH para expresiones como las siguientes:The query optimizer may use the PATH index for expressions such as those shown in the following:

  • /root/Location , que solo especifica una ruta de acceso./root/Location which specify only a path

O BIENOR

  • /root/Location/@LocationID[.="10"] , donde se especifican los valores de ruta de acceso y de nodo./root/Location/@LocationID[.="10"] where both the path and the node value are specified.

La consulta siguiente muestra en qué lugar es útil el índice PATH:The following query shows where the PATH index is helpful:

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")  
  
SELECT CatalogDescription.query('  
  /PD:ProductDescription/PD:Summary  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist ('/PD:ProductDescription/@ProductModelID[.="19"]') = 1  

En la consulta, la expresión de ruta de acceso /PD:ProductDescription/@ProductModelID y el valor "19" del método exist() corresponden a los campos clave del índice PATH.In the query, the path expression /PD:ProductDescription/@ProductModelID and value "19" in the exist() method correspond to the key fields of the PATH index. Esto permite realizar búsquedas directas en el índice PATH y ofrece mejores resultados que la búsqueda secuencial de valores de ruta de acceso en el índice principal.This allows for direct seek in the PATH index and provides better search performance than the sequential search for path values in the primary index.

Índice XML secundario VALUEVALUE Secondary XML Index

Si las consultas se basan en valores, como, por ejemplo, /Root/ProductDescription/@*[. = "Mountain Bike"] o //ProductDescription[@Name = "Mountain Bike"], y la ruta de acceso no se especifica completamente o incluye un carácter comodín, se pueden obtener resultados más rápidos creando un índice XML secundario que se agregue a los valores de nodo en el índice XML principal.If queries are value based, for example, /Root/ProductDescription/@*[. = "Mountain Bike"] or //ProductDescription[@Name = "Mountain Bike"], and the path is not fully specified or it includes a wildcard, you might obtain faster results by building a secondary XML index that is built on node values in the primary XML index.

Las columnas de clave del índice VALUE (valor de nodo y ruta de acceso) pertenecen al índice XML principal.The key columns of the VALUE index are (node value and path) of the primary XML index. Si la carga de trabajo requiere consultar valores de instancias XML sin conocer los nombres de elemento o atributo que contienen los valores, un índice VALUE puede resultar útil.If your workload involves querying for values from XML instances without knowing the element or attribute names that contain the values, a VALUE index may be useful. Por ejemplo, la siguiente expresión se beneficiará del índice VALUE:For example, the following expression will benefit from having a VALUE index:

  • //author[LastName="someName"], donde se conoce el valor del elemento <LastName>, pero el elemento primario <author> puede estar en cualquier lugar.//author[LastName="someName"] where you know the value of the <LastName> element, but the <author> parent can occur anywhere.

  • /book[@* = "someValue"], donde la consulta busca el elemento <book> que contiene algún atributo con el valor "someValue"./book[@* = "someValue"] where the query looks for the <book> element that has some attribute having the value "someValue".

La consulta siguiente devuelve ContactID de la tabla Contact .The following query returns ContactID from the Contact table. La cláusula WHERE especifica un filtro que busca valores en la columna AdditionalContactInfo de tipo xml.The WHERE clause specifies a filter that looks for values in the AdditionalContactInfoxml type column. Los Id. de contacto se devuelven solo si el BLOB XML de información adicional de contacto correspondiente incluye un número de teléfono específico.The contact IDs are returned only if the corresponding additional contact information XML binary large object includes a specific telephone number. Dado que el elemento <telephoneNumber> puede aparecer en cualquier lugar del XML, la expresión de ruta de acceso especifica el eje descendant-or-self.Because the <telephoneNumber> element may appear anywhere in the XML, the path expression specifies the descendent-or-self axis.

WITH XMLNAMESPACES (  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS CI,  
  'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS ACT)  
  
SELECT ContactID   
FROM   Person.Contact  
WHERE  AdditionalContactInfo.exist('//ACT:telephoneNumber/ACT:number[.="111-111-1111"]') = 1  

En esta situación, se conoce el valor de búsqueda para <number>, pero puede aparecer en cualquier lugar de la instancia XML como elemento secundario del elemento <telephoneNumber>.In this situation, the search value for <number> is known, but it can appear anywhere in the XML instance as a child of the <telephoneNumber> element. Este tipo de consulta puede beneficiarse de una búsqueda de índice basada en un valor específico.This kind of query might benefit from an index lookup based on a specific value.

Índice secundario PROPERTYPROPERTY Secondary Index

Las consultas que recuperan uno o varios valores de instancias XML individuales pueden beneficiarse del índice PROPERTY.Queries that retrieve one or more values from individual XML instances might benefit from a PROPERTY index. Este escenario se produce al recuperar propiedades del objeto usando el método value() del tipo xml y cuando se conoce el valor de clave principal del objeto.This scenario occurs when you retrieve object properties by using the value() method of the xml type and when the primary key value of the object is known.

El índice PROPERTY se agrega a columnas (PK, Path y valor de nodo) del índice XML principal, donde PK es la clave principal de la tabla base.The PROPERTY index is built on columns (PK, Path and node value) of the primary XML index where PK is the primary key of the base table.

Por ejemplo, para el modelo de producto 19, la consulta siguiente recupera los valores de los atributos ProductModelID y ProductModelName mediante el método value() .For example, for product model 19, the following query retrieves the ProductModelID and ProductModelName attribute values using the value() method. En lugar de utilizar el índice XML principal o los otros índices XML secundarios, el índice PROPERTY puede ofrecer una ejecución más rápida.Instead of using the primary XML index or the other secondary XML indexes, the PROPERTY index may provide faster execution.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS "PD")  
  
SELECT CatalogDescription.value('(/PD:ProductDescription/@ProductModelID)[1]', 'int') as ModelID,  
       CatalogDescription.value('(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(30)') as ModelName          
FROM Production.ProductModel     
WHERE ProductModelID = 19  

Salvo por las diferencias descritas más adelante en este tema, crear un índice XML en una columna de tipoxml es similar a crear un índice en una columna que no sea de tipoxml .Except for the differences described later in this topic, creating an XML index on anxml type column is similar to creating an index on a non-xml type column. Las siguientes instrucciones DDL Transact-SQLTransact-SQL pueden usarse para crear y administrar índices XML:The following Transact-SQLTransact-SQL DDL statements can be used to create and manage XML indexes:

Obtener información acerca de los índices XMLGetting Information about XML Indexes

Las entradas del índice XML aparecen en la vista de catálogo, sys.indexes, con el "tipo" de índice 3.XML index entries appear in the catalog view, sys.indexes, with the index "type" 3. La columna del nombre contiene el nombre del índice XML.The name column contains the name of the XML index.

Los índices XML también se registran en la vista de catálogo sys.xml_indexes.XML indexes are also recorded in the catalog view, sys.xml_indexes. Ésta contiene todas las columnas de sys.indexes y algunas específicas que son útiles para índices XML.This contains all the columns of sys.indexes and some specific ones that are useful for XML indexes. El valor NULL de la columna secondary_type indica un índice XML principal; los valores "P", "R" y "V" representan los índices XML secundarios PATH, PROPERTY y VALUE, respectivamente.The value NULL in the column, secondary_type, indicates a primary XML index; the values 'P', 'R' and 'V' stand for PATH, PROPERTY, and VALUE secondary XML indexes, respectively.

Es posible encontrar el uso de espacio de los índices XML en la función con valores de tabla sys.dm_db_index_physical_stats.The space use of XML indexes can be found in the table-valued function sys.dm_db_index_physical_stats. Contiene información como el número de páginas de disco ocupadas, el tamaño medio de las filas en bytes y el número de registros de todos los tipos de índice.It provides information, such as the number of disk pages occupied, average row size in bytes, and number of records, for all index types.. Se refiere también a los índices XML.This also includes XML indexes. Esta información está disponible para cada partición de base de datos.This information is available for each database partition. Los índices XML usan el mismo esquema de partición y la misma función de partición que la tabla base.XML indexes use the same partitioning scheme and partitioning function of the base table.

Consulte tambiénSee Also

sys.dm_db_index_physical_stats (Transact-SQL) sys.dm_db_index_physical_stats (Transact-SQL)
Datos XML (SQL Server)XML Data (SQL Server)