最佳化 NewOrg 資料表
您在 使用現有的階層式資料填入資料表 工作中建立的 HumanResources.NewOrd 資料表包含所有員工資訊,並使用 hierarchyid 資料類型代表階層式結構。此工作會加入新索引以支援在 hierarchyid 資料行上進行搜尋。
叢集索引
hierarchyid 資料行 (OrgNode) 是 NewOrg 資料表的主要索引鍵。建立資料表時,它包含名稱為 PK_NewOrg_OrgNode 的叢集索引以強制 OrgNode 資料行的唯一性。此叢集索引也支援深度優先的資料表搜尋。
非叢集索引
此步驟會建立兩個非叢集索引來支援一般搜尋。
建立 NewOrg 資料表的索引以便進行有效率的搜尋
為協助在階層的相同層級進行查詢,使用 GetLevel 方法來建立階層中包含層級的計算資料行。然後,在層級和 Hierarchyid 上建立複合式索引。執行下列程式碼以建立計算資料行和廣度優先的索引:
ALTER TABLE HumanResources.NewOrg ADD H_level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON HumanResources.NewOrg(H_level, OrgNode) ; GO
在 EmployeeID 資料行上建立唯一的索引。這是依 EmployeeID 號碼之單一員工的傳統單一查閱。執行下列程式碼,在 EmployeeID 上建立索引:
CREATE UNIQUE INDEX EmpIDs_unq ON HumanResources.NewOrg(EmployeeID) ; GO
執行下列程式碼,以全部三個索引的順序,從資料表擷取資料:
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
比較結果集以查看每個索引類型中儲存的順序。只有每個輸出的前四個資料列遵照這個順序。
以下為結果集:
深度優先索引:員工記錄緊接著其主管儲存。
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)>。
卸除不必要的資料行
ManagerID 資料行代表員工/主管的關聯性,此種關聯性現在以 OrgNode 資料行代表。如果其他應用程式不需要 ManagerID 資料行,請考慮使用下列陳述式卸除該資料行:
ALTER TABLE HumanResources.NewOrg DROP COLUMN ManagerID ; GO
EmployeeID 資料行也是多餘的。OrgNode 資料行可唯一識別每個員工。如果其他應用程式不需要 EmployeeID 資料行,請考慮使用下列程式碼先卸除索引,再卸除該資料行:
DROP INDEX EmpIDs_unq ON HumanResources.NewOrg ; ALTER TABLE HumanResources.NewOrg DROP COLUMN EmployeeID ; GO
以新的資料表取代原始的資料表
如果您的原始資料表包含任何額外的索引或條件約束,請將它們加入到 NewOrg 資料表中。
以新的資料表取代舊的 EmployeeDemo 資料表。執行下列程式碼卸除舊的資料表,然後以舊名稱重新命名新的資料表:
DROP TABLE HumanResources.EmployeeDemo ; GO sp_rename 'HumanResources.NewOrg', EmployeeDemo ; GO
執行下列程式碼檢查最終的資料表:
SELECT * FROM HumanResources.EmployeeDemo ;