Otimizando a tabela NewOrg
A tabela 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 NewOrg ADD H_Level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON 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 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 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 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.
Aqui está o 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
/ 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
Índice de EmployeeID primário: as linhas são armazenadas na sequência 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
Observação |
---|
Para diagramas que mostrem a diferença entre um índice de profundidade primária e um índice de amplitude primária, consulte Dados hierárquicos (SQL Server). |
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 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 NewOrg ; ALTER TABLE 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 EmployeeDemo ; GO sp_rename 'NewOrg', EmployeeDemo ; GO
Execute o código a seguir para examinar a tabela final:
SELECT * FROM EmployeeDemo ;
Próxima tarefa da lição
Resumo: convertendo uma tabela para uma estrutura hierárquica