Optimisation de la table NewOrg
La table HumanResources.NewOrd que vous avez créée dans la tâche Remplissage d'une table avec des données hiérarchiques existantes contient toutes les informations relatives aux employés et représente la structure hiérarchique à l'aide d'un type de données hierarchyid. Cette tâche ajoute de nouveaux index pour prendre en charge les recherches sur la colonne hierarchyid.
Index cluster
La colonne hierarchyid (OrgNode) est la clé primaire de la table NewOrg. Lorsque la table a été créée, elle contenait un index cluster nommé PK_NewOrg_OrgNode pour appliquer l'unicité de la colonne OrgNode. Cet index cluster prend également en charge une recherche à profondeur prioritaire de la table.
Index non cluster
Cette étape crée deux index non cluster pour prendre en charge des recherches typiques.
Pour indexer la table NewOrg en vue d'effectuer recherches efficaces
Pour faciliter les requêtes au même niveau de la hiérarchie, utilisez la méthode GetLevel pour créer une colonne calculée qui contient le niveau dans la hiérarchie. Créez ensuite un index composite sur le niveau et Hierarchyid. Exécutez le code suivant pour créer la colonne calculée et l'index à largeur prioritaire :
ALTER TABLE HumanResources.NewOrg ADD H_level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON HumanResources.NewOrg(H_level, OrgNode) ; GOCréez un index unique sur la colonne EmployeeID. Il s'agit de la recherche singleton classique d'un seul employé par numéro EmployeeID. Exécutez le code suivant pour créer un index sur EmployeeID :
CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ; GOExécutez le code suivant pour récupérer des données de la table dans l'ordre de chacun des trois index :
SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID, Title FROM HumanResources.NewOrg ORDER BY OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID, Title FROM HumanResources.NewOrg ORDER BY H_Level, OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID, Title FROM HumanResources.NewOrg ORDER BY EmployeeID; GOComparez les jeux de résultats pour voir comment l'ordre est stocké dans chaque type d'index. Seules les quatre premières lignes de chaque de sortie suivent.
Voici l'ensemble des résultats.
Index à profondeur prioritaire : les enregistrements d'employés sont stockés à proximité de leur responsable.
LogicalNode OrgNode H_Level EmployeeID LoginID Title / 0x 0 109 adventure-works\ken0 Chief Executive Officer /1/ 0x58 1 12 adventure-works\terri0 Vice President of Engineering /1/1/ 0x5AC0 2 3 adventure-works\roberto0 Engineering Manager /1/1/1/ 0x5AD6 3 4 adventure-works\rob0 Senior Tool DesignerIndex à largeur prioritaire : les niveaux de gestion sont stockés ensemble.
LogicalNode OrgNode H_Level EmployeeID LoginID Title / 0x 0 109 adventure-works\ken0 Chief Executive Officer /1/ 0x58 1 12 adventure-works\terri0 Vice President of Engineering /2/ 0x68 1 6 adventure-works\david0 Marketing Manager /3/ 0x78 1 42 adventure-works\jean0 Information Services Manager ...Index affichant EmployeeID en priorité : les lignes sont stockées dans l'ordre des EmployeeID.
LogicalNode OrgNode H_Level EmployeeID LoginID Title /6/4/13/12/ 0x961B7640 4 1 adventure-works\guy1 Production Technician - WC60 /2/5/ 0x6C60 2 2 adventure-works\kevin0 Marketing Assistant /1/1/ 0x5AC0 2 3 adventure-works\roberto0 Engineering Manager /1/1/1/ 0x5AD6 3 4 adventure-works\rob0 Senior Tool Designer
[!REMARQUE]
Pour les diagrammes qui affichent la différence entre un index à profondeur prioritaire et un index à largeur prioritaire, consultez Utilisation des types de données hierarchyid (moteur de base de données).
Pour supprimer les colonnes inutiles
La colonne ManagerID représente la relation employé/responsable, qui est maintenant représentée par la colonne OrgNode. Si d'autres applications n'ont pas besoin de la colonne ManagerID, envisagez sa suppression à l'aide de l'instruction suivante :
ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ; GOLa colonne EmployeeID est également redondante. La colonne OrgNode identifie chaque employé de façon unique. Si d'autres applications n'ont pas besoin de la colonne EmployeeID, envisagez la suppression de l'index puis de la colonne en utilisant le code suivant :
DROP INDEX EmpIDs_unq ON HumanResources.NewOrg ; ALTER TABLE HumanResources.NewOrg DROP COLUMN EmployeeID ; GO
Pour remplacer la table d'origine par la nouvelle table
Si votre table d'origine contenait des index ou contraintes supplémentaires, ajoutez-les à la table NewOrg.
Remplacez l'ancienne table EmployeeDemo par la nouvelle table. Exécutez le code suivant pour supprimer l'ancienne table, puis renommez la nouvelle table avec l'ancien nom :
DROP TABLE HumanResources.EmployeeDemo ; GO sp_rename 'HumanResources.NewOrg', EmployeeDemo ; GOExécutez le code suivant pour examiner la table finale :
SELECT * FROM HumanResources.EmployeeDemo ;