Share via


Optimización de la tabla NewOrg

La tabla HumanResources.NewOrd que creó en la tarea Relleno de una tabla con datos jerárquicos existentes contiene toda la información del empleado y representa la estructura jerárquica mediante un tipo de datos hierarchyid. Esta tarea agrega los nuevos índices que admiten las búsquedas en la columna hierarchyid.

Índice clúster

La columna hierarchyid (OrgNode) es la clave principal de la tabla NewOrg. Cuando se creó la tabla, contenía un índice clúster denominado PK_NewOrg_OrgNode para exigir la singularidad de la columna OrgNode. Este índice clúster también admite una búsqueda con prioridad a la profundidad de la tabla.

Índice no agrupado

Este paso crea dos índices no agrupados que admiten búsquedas típicas.

Para indizar la tabla NewOrg a fin de realizar búsquedas eficaces

  1. Si desea ayudar a realizar consultas en el mismo nivel de la jerarquía, utilice el método GetLevel para crear una columna calculada que contenga el nivel en la jerarquía. A continuación, cree un índice compuesto en el nivel y Hierarchyid. Ejecute el código siguiente para crear la columna calculada y el índice con prioridad a la amplitud:

    ALTER TABLE HumanResources.NewOrg 
    ADD H_level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON HumanResources.NewOrg(H_level, OrgNode) ;
    GO
    
  2. Cree un índice único en la columna EmployeeID. Ésta es la búsqueda singleton tradicional de un empleado único por número de EmployeeID. Ejecute el código siguiente para crear un índice en EmployeeID:

    CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ;
    GO
    
  3. Ejecute el código siguiente para recuperar los datos en la tabla en el orden de cada uno de los tres índices:

    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;
    GO
    
  4. Compare los conjuntos de resultados para ver cómo se almacena el orden en cada tipo de índice. Sólo siguen las primeras cuatro filas de cada de salida.

    Éste es el conjunto de resultados.

    Índice con prioridad a la profundidad: los registros del empleado se almacenan junto a su administrador.

    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 Designer
    

    Índice con prioridad a la amplitud: los niveles de administración se almacenan juntos.

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

    El índice con prioridad a EmployeeID: las filas se almacenan en secuencia de 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
    

[!NOTA]

Para diagramas que muestran la diferencia entre un índice con prioridad a la profundidad y uno con prioridad a la amplitud, vea Uso de los tipos de datos hierarchyid (Motor de base de datos).

Para eliminar las columnas innecesarias

  1. La columna ManagerID representa la relación de empleado/administrador, que es representada ahora por la columna OrgNode. Si el resto de aplicaciones no necesitan la columna ManagerID, considere la posibilidad de quitarla mediante la siguiente instrucción:

    ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ;
    GO
    
  2. La columna EmployeeID también es redundante. La columna OrgNode identifica singularmente a cada empleado. Si otras aplicaciones no necesitan la columna EmployeeID, considere la posibilidad de quitar el índice y, a continuación, la columna mediante el código siguiente:

    DROP INDEX EmpIDs_unq ON HumanResources.NewOrg ;
    ALTER TABLE HumanResources.NewOrg DROP COLUMN EmployeeID ;
    GO
    

Para sustituir la tabla original por la nueva tabla

  1. Si la tabla original contenía algún índice o restricción adicional, agréguelos a la tabla NewOrg.

  2. Sustituya la antigua tabla EmployeeDemo por la nueva. Ejecute el código siguiente para quitar la tabla antigua y, a continuación, cambie el nombre de la nueva tabla con el nombre anterior:

    DROP TABLE HumanResources.EmployeeDemo ;
    GO
    sp_rename 'HumanResources.NewOrg', EmployeeDemo ;
    GO
    
  3. Ejecute el código siguiente para examinar la tabla final:

    SELECT * FROM HumanResources.EmployeeDemo ;