Optimieren der NewOrg-Tabelle

Die HumanResources.NewOrg-Tabelle, die Sie in der Aufgabe Auffüllen einer Tabelle mit vorhandenen hierarchischen Daten erstellt haben, enthält alle Angestellteninformationen und stellt die hierarchische Struktur mithilfe des hierarchyid-Datentyps dar. In dieser Aufgabe werden neue Indizes hinzugefügt, die das Suchen in der hierarchyid-Spalte unterstützen.

Gruppierter Index

Die hierarchyid-Spalte (OrgNode) ist der Primärschlüssel für die Tabelle NewOrg. Als die Tabelle erstellt wurde, enthielt sie den gruppierten Index PK_NewOrg_OrgNode, der die Eindeutigkeit der OrgNode-Spalte erzwingen sollte. Dieser gruppierte Index unterstützt auch eine Tiefensuche in der Tabelle.

Nicht gruppierter Index

Dieser Schritt erstellt zwei nicht gruppierte Indizes, um typische Suchoperationen zu unterstützen.

So indizieren Sie die Tabelle 'NewOrg' für effiziente Suchoperationen

  1. Zur Unterstützung von Abfragen der gleichen Ebene in der Hierarchie, verwenden Sie die GetLevel-Methode, um eine berechnete Spalte zu erstellen, welche die Ebene in der Hierarchie enthält. Erstellen Sie dann für diese und die Hierarchyid-Spalte einen zusammengesetzten Index. Führen Sie den folgenden Code aus, um die berechnete Spalte und den Breitensuchindex zu erstellen:

    ALTER TABLE HumanResources.NewOrg 
    ADD H_level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON HumanResources.NewOrg(H_level, OrgNode) ;
    GO
    
  2. Erstellen Sie für die Spalte EmployeeID einen eindeutigen Index. Dies ist der übliche Singleton-Suchvorgang nach einem einzelnen Mitarbeiter entsprechend der EmployeeID-Nummer. Führen Sie den folgenden Code aus, um für EmployeeID einen Index zu erstellen:

    CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ;
    GO
    
  3. Fügen Sie folgenden Code aus, um die Daten der Tabelle in der Reihenfolge jedes der drei Indizes abzurufen.

    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. Vergleichen Sie die Resultsets, um zu sehen, wie die Reihenfolge in jedem Indextyp gespeichert wird. Im Folgenden werden nur die ersten vier Zeilen jeder Ausgabe gezeigt.

    Dies ist das Resultset.

    Tiefensuchindex: Mitarbeiterdatensätze sind angrenzend an den ihres Managers gespeichert.

    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
    

    Breitensuchindex: Managementebenen sind zusammen gespeichert.

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

    Eindeutiger EmployeeID-Index: Zeilen werden in der EmployeeID-Reihenfolge gespeichert.

    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
    
HinweisHinweis

Diagramme, die den Unterschied zwischen einem Tiefensuchindex und einem Breitensuchindex zeigen, finden Sie unter Verwenden von hierarchyid-Datentypen (Datenbankmodul).

So löschen Sie die unnötigen Spalten

  1. Die Spalte ManagerID stellt die Mitarbeiter-/Managerbeziehung dar, die jetzt von der Spalte OrgNode dargestellt wird. Wenn andere Anwendungen die Spalte ManagerID nicht benötigen, könnten Sie diese Spalte löschen, indem Sie die folgende Anweisung verwenden:

    ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ;
    GO
    
  2. Die Spalte EmployeeID ist ebenfalls überflüssig. Jeder Mitarbeiter wird bereits durch die Spalte OrgNode eindeutig identifiziert. Wenn andere Anwendungen die Spalte EmployeeID nicht benötigen, könnten Sie den Index und dann die Spalte löschen, indem Sie folgenden Code verwenden:

    DROP INDEX EmpIDs_unq ON HumanResources.NewOrg ;
    ALTER TABLE HumanResources.NewOrg DROP COLUMN EmployeeID ;
    GO
    

So ersetzen Sie die ursprüngliche durch die neue Tabelle

  1. Wenn die ursprüngliche Tabelle irgendwelche zusätzlichen Indizes oder Einschränkungen enthält, dann fügen Sie diese der Tabelle NewOrg hinzu.

  2. So ersetzen Sie die alte EmployeeDemo-Tabelle durch die neue Tabelle. Führen Sie folgenden Code aus, um die alte Tabelle zu löschen und dann die neue Tabelle mit dem Namen der alten Tabelle zu benennen:

    DROP TABLE HumanResources.EmployeeDemo ;
    GO
    sp_rename 'HumanResources.NewOrg', EmployeeDemo ;
    GO
    
  3. Führen Sie den folgenden Code aus, um die neue Tabelle zu untersuchen:

    SELECT * FROM HumanResources.EmployeeDemo ;