Partilhar via


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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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çãoObservaçã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

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

  1. Se a sua tabela original continha qualquer índice adicional ou restrições, adicione-os à tabela NewOrg.

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