Optimizar la tabla NewOrg
La tabla NewOrd que creó en la tarea Rellenar una tabla con los 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 clúster
Este paso crea dos índices no clúster que admiten búsquedas típicas.
Para indizar la tabla NewOrg a fin de realizar búsquedas eficaces
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 NewOrg ADD H_Level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON NewOrg(H_Level, OrgNode) ; GO
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 NewOrg(EmployeeID) ; GO
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 FROM NewOrg ORDER BY OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID FROM NewOrg ORDER BY H_Level, OrgNode; SELECT OrgNode.ToString() AS LogicalNode, OrgNode, H_Level, EmployeeID, LoginID FROM NewOrg ORDER BY EmployeeID; GO
Compare los conjuntos de resultados para ver cómo se almacena el orden en cada tipo de índice. Solo siguen las primeras cuatro filas de cada de salida.
El conjunto de resultados es el siguiente.
Índice con prioridad a la profundidad: los registros del empleado se almacenan junto a su administrador.
LogicalNode OrgNode H_Level EmployeeID LoginID
/ 0x 0 1 zarifin
/1/ 0x58 1 2 tplate
/1/1/ 0x5AC0 2 4 schai
/1/1/1/ 0x5AD6 3 9 jwang
/1/1/2/ 0x5ADA 3 10 malexander
/1/2/ 0x5B40 2 5 elang
/1/3/ 0x5BC0 2 6 gsmits
/2/ 0x68 1 3 hjensen
/2/1/ 0x6AC0 2 7 sdavis
/2/2/ 0x6B40 2 8 norint
El índice con prioridad a EmployeeID: las filas se almacenan en secuencia de EmployeeID.
LogicalNode OrgNode H_Level EmployeeID LoginID
/ 0x 0 1 zarifin
/1/ 0x58 1 2 tplate
/2/ 0x68 1 3 hjensen
/1/1/ 0x5AC0 2 4 schai
/1/2/ 0x5B40 2 5 elang
/1/3/ 0x5BC0 2 6 gsmits
/2/1/ 0x6AC0 2 7 sdavis
/2/2/ 0x6B40 2 8 norint
/1/1/1/ 0x5AD6 3 9 jwang
/1/1/2/ 0x5ADA 3 10 malexander
[!NOTA]
Para diagramas que muestran la diferencia entre un índice con prioridad a la profundidad y uno con prioridad a la amplitud, vea Datos jerárquicos (SQL Server).
Para eliminar las columnas innecesarias
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 NewOrg DROP COLUMN ManagerID ; GO
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 NewOrg ; ALTER TABLE NewOrg DROP COLUMN EmployeeID ; GO
Para sustituir la tabla original por la nueva tabla
Si la tabla original contenía algún índice o restricción adicional, agréguelos a la tabla NewOrg.
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 EmployeeDemo ; GO sp_rename 'NewOrg', EmployeeDemo ; GO
Ejecute el código siguiente para examinar la tabla final:
SELECT * FROM EmployeeDemo ;
Siguiente tarea de la lección
Resumen: Conversión de una tabla en una estructura jerárquica