1-3단원 - NewOrg 테이블 최적화Lesson 1-3 - Optimizing the NewOrg Table

기존 계층적 데이터로 테이블 채우기 태스크에서 만든 NewOrd 테이블은 모든 직원 정보를 포함하며 hierarchyid 데이터 형식을 사용하여 계층 구조를 나타냅니다.The NewOrd table that you created in the Populating a Table with Existing Hierarchical Data task contains all the employee information, and represents the hierarchical structure by using a hierarchyid data type. 이 태스크에서는 새 인덱스를 추가하여 hierarchyid 열의 검색을 지원합니다.This task adds new indexes to support searches on the hierarchyid column.

클러스터형 인덱스Clustered Index

hierarchyid 열(OrgNode)은 NewOrg 테이블의 기본 키입니다.The hierarchyid column (OrgNode) is the primary key for the NewOrg table. 테이블을 만들 때 OrgNode 열의 고유성을 적용하기 위해 이 열에 PK_NewOrg_OrgNode 라는 클러스터형 인덱스가 포함되었습니다.When the table was created, it contained a clustered index named PK_NewOrg_OrgNode to enforce the uniqueness of the OrgNode column. 이 클러스터형 인덱스는 테이블의 깊이 우선 검색도 지원합니다.This clustered index also supports a depth-first search of the table.

비클러스터형 인덱스Nonclustered Index

이 단계에서는 일반적인 검색을 지원하는 두 개의 비클러스터형 인덱스를 만듭니다.This step creates two nonclustered indexes to support typical searches.

효율적인 검색을 위해 NewOrg 테이블을 인덱싱하려면To index the NewOrg table for efficient searches

  1. 계층의 같은 수준에서의 쿼리를 돕기 위해 GetLevel 메서드를 사용하여 계층의 수준을 포함하는 계산 열을 만듭니다.To help queries at the same level in the hierarchy, use the GetLevel method to create a computed column that contains the level in the hierarchy. 그런 다음 수준 및 Hierarchyid에 대한 복합 인덱스를 만듭니다.Then, create a composite index on the level and the Hierarchyid. 다음 코드를 실행하여 계산 열과 너비 우선 인덱스를 만듭니다.Run the following code to create the computed column and the breadth-first index:

    ALTER TABLE NewOrg   
       ADD H_Level AS OrgNode.GetLevel() ;  
    CREATE UNIQUE INDEX EmpBFInd   
       ON NewOrg(H_Level, OrgNode) ;  
    GO  
    
  2. EmployeeID 열에 대한 고유 인덱스를 만듭니다.Create a unique index on the EmployeeID column. 이는 EmployeeID 번호를 기준으로 단일 직원을 단일 조회하는 일반적인 방법입니다.This is the traditional singleton lookup of a single employee by EmployeeID number. 다음 코드를 실행하여 EmployeeID에 대한 인덱스를 만듭니다.Run the following code to create an index on EmployeeID:

    CREATE UNIQUE INDEX EmpIDs_unq ON NewOrg(EmployeeID) ;  
    GO  
    
  3. 다음 코드를 실행하여 3가지 인덱스 각각의 순서대로 테이블에서 데이터를 검색합니다.Run the following code to retrieve data from the table in the order of each of the three indexes:

    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 the result sets to see how the order is stored in each type of index. 각 출력의 처음 4개 행만 표시됩니다.Only the first four rows of each output follow.

    결과 집합은 다음과 같습니다.Here is the result set.

    깊이 우선 인덱스: 직원 레코드가 해당 관리자에 인접하게 저장됩니다.Depth-first index: Employee records are stored adjacent to their manager.

    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

    EmployeeID 우선 인덱스: 행이 EmployeeID 시퀀스에 저장됩니다.EmployeeID-first index: Rows are stored in EmployeeID sequence.

    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

참고

깊이 우선 인덱스와 너비 우선 인덱스의 차이를 보여 주는 다이어그램은 계층적 데이터(SQL Server)를 참조하세요.For diagrams that show the difference between a depth-first index and a breadth-first index, see Hierarchical Data (SQL Server).

불필요한 열을 삭제하려면To drop the unnecessary columns

  1. ManagerID 열은 직원/관리자 관계를 나타냅니다(이제 OrgNode 열이 나타냄).The ManagerID column represents the employee/manager relationship, which is now represented by the OrgNode column. 다른 응용 프로그램에 ManagerID 열이 필요하지 않은 경우 다음 문을 사용하여 해당 열을 삭제하는 것이 좋습니다.If other applications do not need the ManagerID column, consider dropping it by using the following statement:

    ALTER TABLE NewOrg DROP COLUMN ManagerID ;  
    GO  
    
  2. EmployeeID 열도 중복됩니다.The EmployeeID column is also redundant. OrgNode 열은 각 직원을 고유하게 식별합니다.The OrgNode column uniquely identifies each employee. 다른 응용 프로그램에 EmployeeID 열이 필요하지 않은 경우 다음 코드를 사용하여 인덱스와 열을 차례로 삭제하는 것이 좋습니다.If other applications do not need the EmployeeID column, consider dropping the index and then the column by using the following code:

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

원래 테이블을 새 테이블로 바꾸려면To replace the original table with the new table

  1. 원래 테이블에 추가 인덱스 또는 제약 조건이 포함된 경우 이를 NewOrg 테이블에 추가합니다.If your original table contained any additional indexes or constraints, add them to the NewOrg table.

  2. 이전 EmployeeDemo 테이블을 새 테이블로 바꿉니다.Replace the old EmployeeDemo table with the new table. 다음 코드를 실행하여 이전 테이블을 삭제한 다음 새 테이블의 이름을 이전 이름으로 바꿉니다.Run the following code to drop the old table, and then rename the new table with the old name:

    DROP TABLE EmployeeDemo ;  
    GO  
    sp_rename 'NewOrg', EmployeeDemo ;  
    GO  
    
  3. 다음 코드를 실행하여 최종 테이블을 검사합니다.Run the following code to examine the final table:

    SELECT * FROM EmployeeDemo ;  
    

단원의 다음 태스크Next Task in Lesson

요약: 테이블을 계층 구조로 변환Summary: Converting a Table to a Hierarchical Structure