NewOrg 테이블 최적화
기존 계층적 데이터로 테이블 채우기 태스크에서 만든 NewOrd 테이블은 모든 직원 정보를 포함하며 hierarchyid 데이터 형식을 사용하여 계층 구조를 나타냅니다. 이 태스크에서는 새 인덱스를 추가하여 hierarchyid 열에서의 검색을 지원합니다.
클러스터형 인덱스
hierarchyid 열(OrgNode)은 NewOrg 테이블의 기본 키입니다. 테이블 생성 시 이 열에는 OrgNode 열의 고유성을 강제 적용하는 PK_NewOrg_OrgNode라는 클러스터형 인덱스가 포함되었습니다. 이 클러스터형 인덱스는 테이블의 깊이 우선 검색도 지원합니다.
비클러스터형 인덱스
이 단계에서는 일반적인 검색을 지원하는 두 개의 비클러스터형 인덱스를 만듭니다.
효율적인 검색을 위해 NewOrg 테이블을 인덱싱하려면
계층의 같은 수준에서의 쿼리를 돕기 위해 GetLevel 메서드를 사용하여 계층의 수준을 포함하는 계산 열을 만듭니다. 그런 다음 수준 및 Hierarchyid에 대한 복합 인덱스를 만듭니다. 다음 코드를 실행하여 계산 열과 너비 우선 인덱스를 만듭니다.
ALTER TABLE NewOrg ADD H_Level AS OrgNode.GetLevel() ; CREATE UNIQUE INDEX EmpBFInd ON NewOrg(H_Level, OrgNode) ; GO
EmployeeID 열에 대한 고유 인덱스를 만듭니다. 이는 EmployeeID 번호를 기준으로 단일 직원을 단일 조회하는 일반적인 방법입니다. 다음 코드를 실행하여 EmployeeID에 대한 인덱스를 만듭니다.
CREATE UNIQUE INDEX EmpIDs_unq ON NewOrg(EmployeeID) ; GO
다음 코드를 실행하여 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개 행만 표시됩니다.
결과 집합은 다음과 같습니다.
깊이 우선 인덱스: 직원 레코드가 해당 관리자에 인접하게 저장됩니다.
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)을 참조하십시오.
불필요한 열을 삭제하려면
ManagerID 열은 직원/관리자 관계(이제 OrgNode 열이 나타냄)를 나타냅니다. 다른 응용 프로그램에 ManagerID 열이 필요하지 않은 경우 다음 문을 사용하여 해당 열을 삭제하십시오.
ALTER TABLE NewOrg DROP COLUMN ManagerID ; GO
EmployeeID 열도 중복됩니다. OrgNode 열은 각 직원을 고유하게 식별합니다. 다른 응용 프로그램에 EmployeeID 열이 필요하지 않은 경우 다음 코드를 사용하여 인덱스를 삭제한 다음 해당 열을 삭제하십시오.
DROP INDEX EmpIDs_unq ON NewOrg ; ALTER TABLE NewOrg DROP COLUMN EmployeeID ; GO
원래 테이블을 새 테이블로 바꾸려면
원래 테이블에 추가 인덱스 또는 제약 조건이 포함된 경우 이를 NewOrg 테이블에 추가합니다.
이전 EmployeeDemo 테이블을 새 테이블로 바꿉니다. 다음 코드를 실행하여 이전 테이블을 삭제한 다음 새 테이블의 이름을 이전 이름으로 바꿉니다.
DROP TABLE EmployeeDemo ; GO sp_rename 'NewOrg', EmployeeDemo ; GO
다음 코드를 실행하여 최종 테이블을 검사합니다.
SELECT * FROM EmployeeDemo ;