Compartilhar via


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

  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 HumanResources.NewOrg 
    ADD H_level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON HumanResources.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 HumanResources.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, 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 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çãoObservaçã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

  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 HumanResources.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 HumanResources.NewOrg ;
    ALTER TABLE HumanResources.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 HumanResources.EmployeeDemo ;
    GO
    sp_rename 'HumanResources.NewOrg', EmployeeDemo ;
    GO
    
  3. Execute o código a seguir para examinar a tabela final:

    SELECT * FROM HumanResources.EmployeeDemo ;