Partager via


Index XML primaire

L'index XML primaire indexe toutes les balises, valeurs et chemins d'accès rencontrés dans les instances XML d'une colonne XML. Pour créer un index XML primaire, la table dans laquelle la colonne XML se produit doit avoir un index cluster sur la clé primaire de la table. SQL Server utilise cette clé primaire pour mettre en correspondance les lignes dans l'index XML primaire avec les lignes de la table qui contient la colonne XML.

L'index XML primaire correspond à une représentation fragmentée et persistante des objets blob XML inclus dans la colonne des données de type xml. Pour chacun de ces objets blob XML de la colonne, l'index crée plusieurs lignes de données. Le nombre de lignes dans l'index est presque égal au nombre de nœuds se trouvant dans l'objet blob XML. Lorsqu'une requête extrait l'intégralité de l'instance XML, SQL Server fournit l'instance à partir de la colonne XML. Les requêtes dans des instances XML utilisent l'index XML primaire et peuvent renvoyer des valeurs scalaires ou des sous-arborescences XML en se servant de l'index lui-même.

Chaque ligne stocke les informations suivantes relatives aux nœuds :

  • Le nom de la balise tel que le nom d'un élément ou d'un attribut.

  • La valeur du nœud.

  • Le type de nœud, par exemple un nœud élément, un nœud attribut ou un nœud texte.

  • Les informations sur l'ordre du document, représentées par un identifiant de nœud interne.

  • Le chemin d'accès de chacun des nœuds vers la racine de l'arborescence XML. Cette colonne fait l'objet de recherches pour y trouver la présence d'expressions de chemin d'accès mentionnées dans la requête.

  • La clé primaire de la table de base. Cette clé est copiée dans l'index XML primaire afin de pouvoir effectuer une jointure en retour avec la table de base et le nombre maximal de colonnes dans la clé primaire de la table de base est limité à 15.

Les informations de ce nœud sont utilisées afin d'évaluer et d'élaborer les résultats sous forme de données XML découlant d'une requête donnée. Pour des raisons d'optimisation, les informations relatives au nom de la balise et au type de nœud sont encodées sous forme de valeurs entières et la colonne Path s'appuie sur ce même encodage. En outre, les chemins d'accès sont stockés dans l'ordre inverse afin de pouvoir faire correspondre les chemins d'accès où seul le suffixe est connu. Par exemple :

  • //ContactRecord/PhoneNumber, où seuls les deux derniers niveaux sont connus ;

- ou -

  • /Book/*/Title, où le caractère générique (*) est mentionné au milieu de l'expression.

Le processeur de requêtes utilise l'index XML primaire dans le cas de requêtes mettant en œuvre des Méthodes des types de données xml et renvoie les valeurs scalaires ou les sous-arborescences XML tirées de l'index primaire lui-même (cet index stocke toutes les informations nécessaires afin de reconstruire l'instance XML).

Par exemple, la requête suivante renvoie les informations sommaires stockées dans la colonne CatalogDescription de type xml et provenant de la table ProductModel. Elle ne renvoie les informations dans la balise <Summary> que pour les modèles de produits dont la description de catalogue stocke également la description située dans la balise <Features>.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2008/07/adventure-works2008R2/ProductModelDescription' AS "PD")

SELECT CatalogDescription.query('
  /PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
WHERE CatalogDescription.exist ('/PD:ProductDescription/PD:Features') = 1

Concernant l'index XML primaire, au lieu de fragmenter chaque instance d'objet blob XML se trouvant dans la table de base, les lignes de l'index correspondant à chaque objet blob XML sont soumises à des recherches séquentielles pour retrouver l'expression indiquée dans la méthode exist(). Si le chemin d'accès est retrouvé dans la colonne Path de l'index, l'élément <Summary> ainsi que ses sous-arborescences sont extraits de l'index XML primaire, puis convertis en objet blob XML suite à l'exécution de la méthode query().

Notez que l'index XML primaire n'est pas sollicité lors de la récupération d'une instance XML complète. Par exemple, la requête suivante extrait de la table l'instance XML tout entière décrivant les instructions de fabrication d'un modèle de produit donné.

USE AdventureWorks2008R2;

SELECT Instructions
FROM Production.ProductModel 
WHERE ProductModelID=7;