다음을 통해 공유


NewOrg 테이블 최적화

기존 계층적 데이터로 테이블 채우기 태스크에서 만든 NewOrd 테이블은 모든 직원 정보를 포함하며 hierarchyid 데이터 형식을 사용하여 계층 구조를 나타냅니다. 이 태스크에서는 새 인덱스를 추가하여 hierarchyid 열에서의 검색을 지원합니다.

클러스터형 인덱스

hierarchyid 열(OrgNode)은 NewOrg 테이블의 기본 키입니다. 테이블 생성 시 이 열에는 OrgNode 열의 고유성을 강제 적용하는 PK_NewOrg_OrgNode라는 클러스터형 인덱스가 포함되었습니다. 이 클러스터형 인덱스는 테이블의 깊이 우선 검색도 지원합니다.

비클러스터형 인덱스

이 단계에서는 일반적인 검색을 지원하는 두 개의 비클러스터형 인덱스를 만듭니다.

효율적인 검색을 위해 NewOrg 테이블을 인덱싱하려면

  1. 계층의 같은 수준에서의 쿼리를 돕기 위해 GetLevel 메서드를 사용하여 계층의 수준을 포함하는 계산 열을 만듭니다. 그런 다음 수준 및 Hierarchyid에 대한 복합 인덱스를 만듭니다. 다음 코드를 실행하여 계산 열과 너비 우선 인덱스를 만듭니다.

    ALTER TABLE NewOrg 
       ADD H_Level AS OrgNode.GetLevel() ;
    CREATE UNIQUE INDEX EmpBFInd 
       ON NewOrg(H_Level, OrgNode) ;
    GO
    
  2. EmployeeID 열에 대한 고유 인덱스를 만듭니다. 이는 EmployeeID 번호를 기준으로 단일 직원을 단일 조회하는 일반적인 방법입니다. 다음 코드를 실행하여 EmployeeID에 대한 인덱스를 만듭니다.

    CREATE UNIQUE INDEX EmpIDs_unq ON NewOrg(EmployeeID) ;
    GO
    
  3. 다음 코드를 실행하여 3가지 인덱스 각각의 순서대로 테이블에서 데이터를 검색합니다.

    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. 결과 집합을 비교하여 각 인덱스 유형에서 순서가 저장되는 방법을 확인합니다. 각 출력의 처음 4개 행만 표시됩니다.

    결과 집합은 다음과 같습니다.

    깊이 우선 인덱스: 직원 레코드가 해당 관리자에 인접하게 저장됩니다.

    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 시퀀스에 저장됩니다.

    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)을 참조하십시오.

불필요한 열을 삭제하려면

  1. ManagerID 열은 직원/관리자 관계(이제 OrgNode 열이 나타냄)를 나타냅니다. 다른 응용 프로그램에 ManagerID 열이 필요하지 않은 경우 다음 문을 사용하여 해당 열을 삭제하십시오.

    ALTER TABLE NewOrg DROP COLUMN ManagerID ;
    GO
    
  2. EmployeeID 열도 중복됩니다. OrgNode 열은 각 직원을 고유하게 식별합니다. 다른 응용 프로그램에 EmployeeID 열이 필요하지 않은 경우 다음 코드를 사용하여 인덱스를 삭제한 다음 해당 열을 삭제하십시오.

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

원래 테이블을 새 테이블로 바꾸려면

  1. 원래 테이블에 추가 인덱스 또는 제약 조건이 포함된 경우 이를 NewOrg 테이블에 추가합니다.

  2. 이전 EmployeeDemo 테이블을 새 테이블로 바꿉니다. 다음 코드를 실행하여 이전 테이블을 삭제한 다음 새 테이블의 이름을 이전 이름으로 바꿉니다.

    DROP TABLE EmployeeDemo ;
    GO
    sp_rename 'NewOrg', EmployeeDemo ;
    GO
    
  3. 다음 코드를 실행하여 최종 테이블을 검사합니다.

    SELECT * FROM EmployeeDemo ;
    

단원의 다음 태스크

요약: 테이블을 계층 구조로 변환