Otimizando a tabela NewOrg
A tabela HumanResources.NewOrd que você criou na tarefa Populando uma tabela com dados hierárquicos existentes contém todas as informações dos funcionários e representa a estrutura hierárquica usando um tipo de dados hierarchyid. Essa tarefa adiciona índices novos para oferecer suporte às pesquisas na coluna hierarchyid.
Índice clusterizado
A coluna hierarchyid (OrgNode) é a chave primária para a tabela NewOrg. Quando a tabela foi criada, continha um índice clusterizado chamado PK_NewOrg_OrgNode para impor a exclusividade da coluna OrgNode. Esse índice clusterizado também oferece suporte a uma pesquisa primária detalhada da tabela.
Índice não-clusterizado
Este passo cria dois índices não-clusterizados para oferecer suporte a pesquisas típicas.
Para indexar a tabela NewOrg para pesquisas eficientes
Para ajudar consultas no mesmo nível na hierarquia, use o método GetLevel para criar uma coluna computada que contém o nível na hierarquia. Então, crie um índice composto no nível e a Hierarchyid. Execute o código a seguir para criar a coluna computada e o índice de amplitude primária:
ALTER TABLE HumanResources.NewOrg ADD H_level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON HumanResources.NewOrg(H_level, OrgNode) ; GO
Crie um índice exclusivo na coluna EmployeeID. Esta é uma pesquisa singleton tradicional de um único empregado através do número EmployeeID. Execute o código a seguir para criar um índice em EmployeeID:
CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ; GO
Execute o código a seguir para recuperar dados da tabela na ordem de cada um dos três í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
Compare os conjuntos de resultados para ver como a ordem está armazenada em cada tipo de índice. Seguem apenas as primeiras quatro linhas de cada saída.
Conjunto de resultados.
Índice de profundidade primária: os registros de funcionário são armazenados adjacentes aos de seu gerente.
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 de amplitude primária: níveis de gerência são armazenados em conjunto.
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 ...
Índice de EmployeeID primário: as linhas são armazenadas na seqüência 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
Observação |
---|
Para diagramas que mostrem a diferença entre um índice de profundidade primária e um índice de amplitude primária, consulte Usando tipos de dados hierarchyid (Mecanismo de Banco de Dados). |
Para cancelar as colunas desnecessárias
A coluna ManagerID representa a relação empregado/gerente, que é representada agora pela coluna OrgNode. Se outros aplicativos não precisarem da coluna ManagerID, considere cancelá-la usando a seguinte instrução:
ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ; GO
A coluna EmployeeID também é redundante. A coluna OrgNode identifica cada empregado exclusivamente. Se os outros aplicativos não precisarem da coluna EmployeeID, considere cancelar o índice, e depois a coluna, usando o código a seguir:
DROP INDEX EmpIDs_unq ON HumanResources.NewOrg ; ALTER TABLE HumanResources.NewOrg DROP COLUMN EmployeeID ; GO
Para substituir a tabela original pela tabela nova
Se a sua tabela original continha qualquer índice adicional ou restrições, adicione-os à tabela NewOrg.
Substitua a tabela antiga EmployeeDemo pela nova tabela. Execute o código a seguir para cancelar a tabela antiga e então renomeie a tabela nova com o nome antigo:
DROP TABLE HumanResources.EmployeeDemo ; GO sp_rename 'HumanResources.NewOrg', EmployeeDemo ; GO
Execute o código a seguir para examinar a tabela final:
SELECT * FROM HumanResources.EmployeeDemo ;