共用方式為


最佳化 NewOrg 資料表

您在 使用現有的階層式資料填入資料表 工作中建立的 HumanResources.NewOrd 資料表包含所有員工資訊,並使用 hierarchyid 資料類型代表階層式結構。此工作會加入新索引以支援在 hierarchyid 資料行上進行搜尋。

叢集索引

hierarchyid 資料行 (OrgNode) 是 NewOrg 資料表的主要索引鍵。建立資料表時,它包含名稱為 PK_NewOrg_OrgNode 的叢集索引以強制 OrgNode 資料行的唯一性。此叢集索引也支援深度優先的資料表搜尋。

非叢集索引

此步驟會建立兩個非叢集索引來支援一般搜尋。

建立 NewOrg 資料表的索引以便進行有效率的搜尋

  1. 為協助在階層的相同層級進行查詢,使用 GetLevel 方法來建立階層中包含層級的計算資料行。然後,在層級和 Hierarchyid 上建立複合式索引。執行下列程式碼以建立計算資料行和廣度優先的索引:

    ALTER TABLE HumanResources.NewOrg 
    ADD H_level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON HumanResources.NewOrg(H_level, OrgNode) ;
    GO
    
  2. EmployeeID 資料行上建立唯一的索引。這是依 EmployeeID 號碼之單一員工的傳統單一查閱。執行下列程式碼,在 EmployeeID 上建立索引:

    CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ;
    GO
    
  3. 執行下列程式碼,以全部三個索引的順序,從資料表擷取資料:

    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. 比較結果集以查看每個索引類型中儲存的順序。只有每個輸出的前四個資料列遵照這個順序。

    以下為結果集:

    深度優先索引:員工記錄緊接著其主管儲存。

    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
    

    廣度優先索引:管理層級會儲存在一起。

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

    EmployeeID 優先索引:資料列會以 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
    

[!附註]

如需顯示深度優先索引與廣度優先索引間差異的圖表,請參閱<使用 hierarchyid 資料類型 (Database Engine)>。

卸除不必要的資料行

  1. ManagerID 資料行代表員工/主管的關聯性,此種關聯性現在以 OrgNode 資料行代表。如果其他應用程式不需要 ManagerID 資料行,請考慮使用下列陳述式卸除該資料行:

    ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ;
    GO
    
  2. EmployeeID 資料行也是多餘的。OrgNode 資料行可唯一識別每個員工。如果其他應用程式不需要 EmployeeID 資料行,請考慮使用下列程式碼先卸除索引,再卸除該資料行:

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

以新的資料表取代原始的資料表

  1. 如果您的原始資料表包含任何額外的索引或條件約束,請將它們加入到 NewOrg 資料表中。

  2. 以新的資料表取代舊的 EmployeeDemo 資料表。執行下列程式碼卸除舊的資料表,然後以舊名稱重新命名新的資料表:

    DROP TABLE HumanResources.EmployeeDemo ;
    GO
    sp_rename 'HumanResources.NewOrg', EmployeeDemo ;
    GO
    
  3. 執行下列程式碼檢查最終的資料表:

    SELECT * FROM HumanResources.EmployeeDemo ;