다음을 통해 공유


NewOrg 테이블 최적화

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

클러스터형 인덱스

hierarchyid 열(OrgNode)은 NewOrg 테이블의 기본 키입니다. 테이블 생성 시 이 열에는 OrgNode 열의 고유성을 강제 적용하는 PK_NewOrg_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. 다음 코드를 실행하여 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. 결과 집합을 비교하여 각 인덱스 유형에서 순서가 저장되는 방법을 확인합니다. 각 출력의 처음 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 데이터 형식 사용(데이터베이스 엔진)을 참조하십시오.

불필요한 열을 삭제하려면

  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 ;