적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric의 SQL 데이터베이스
hierarchyid 데이터 형식은 가변 길이의 시스템 데이터 형식입니다. hierarchyid는 계층에서의 위치를 나타내는 데 사용됩니다. hierarchyid 형식의 열은 트리를 자동으로 나타내지 않습니다. 행 간의 원하는 관계가 값에 반영되는 방식으로 hierarchyid 값을 생성하고 할당하는 것은 애플리케이션의 책임입니다.
hierarchyid 데이터 형식의 값은 트리 계층에서의 위치를 나타냅니다. hierarchyid 값의 속성은 다음과 같습니다.
매우 압축: n 개 노드가 있는 트리의 노드를 나타내는 데 필요한 평균 비트 수는 평균 팬아웃(노드의 평균 자식 수)에 따라 달라집니다. 작은 팬아웃(0-7)의 경우 크기는 약 6 * logA n 비트이며, 여기서 A는 평균 팬아웃입니다. 평균 6개 수준의 팬아웃이 있는 100,000명의 조직 계층 구조에 있는 노드에는 약 38비트가 소요됩니다. 이는 스토리지를 위해 40비트나 5바이트로 반올림됩니다.
비교는 깊이 우선 순서입니다. 두 계층 구조 값
a이 지정되고b트리a<b의 깊이 우선 순회에서 b 앞에 오는 것을 의미합니다. hierarchyid 데이터 형식의 인덱스에는 깊이 우선 순서가 사용되며 깊이 우선 탐색에서 서로 가까이 있는 노드는 서로 가깝게 저장됩니다. 예를 들어 레코드의 자식은 해당 레코드에 인접하게 저장됩니다. 자세한 내용은 계층적 데이터(SQL Server)를 참조하세요.임의 삽입 및 삭제 지원: GetDescendant 메서드를 사용하면 지정된 노드의 오른쪽, 지정된 노드의 왼쪽 또는 두 형제 간에 형제를 생성할 수 있습니다. 임의 개수의 노드를 계층에서 삽입하거나 삭제할 때 비교 속성이 유지됩니다. 대부분의 삽입 및 삭제 시 압축성 속성이 유지됩니다. 그러나 두 노드 사이에 삽입하면 약간 덜 간결한 표현으로 hierarchyid 값이 생성됩니다.
인코딩은 892바이트로 제한됩니다 . 따라서 892바이트에 맞게 표현에 수준이 너무 많은 노드는 hierarchyid 형식으로 나타낼 수 없습니다.
hierarchyid 형식은 CLR(공용 언어 런타임) 클라이언트에서 SqlHierarchyId 데이터 형식으로 사용할 수 있습니다.
Remarks
hierarchyid 형식은 트리의 루트에서 노드까지의 경로를 인코딩하는 방법으로 계층 트리의 단일 노드에 대한 정보를 논리적으로 인코딩합니다. 이러한 경로는 루트 이후 거친 모든 자식의 노드 레이블 시퀀스로 논리적으로 표현됩니다. 표현은 슬래시로 시작하며 루트만 거친 경로는 단일 슬래시로 표시됩니다. 루트 아래 수준의 경우 각 레이블은 마침표로 분리된 정수 시퀀스로 인코딩됩니다.
자식 간의 비교는 마침표로 분리된 정수 시퀀스를 사전 순서로 비교하여 수행됩니다. 각 수준 다음에는 슬래시가 사용됩니다. 즉, 슬래시가 부모와 자식을 분리합니다. 예를 들어 다음은 길이가 각각 1, 2, 2, 3 및 3 수준인 유효한 hierarchyid 경로입니다.
//1//0.3.-7//1/3//0.1/0.2/
노드는 어느 위치에나 삽입할 수 있습니다. 이후와 그 이전에 /1/2//1/3/ 삽입된 노드는 .로 /1/2.5/표시될 수 있습니다. 이전에 0 삽입된 노드에는 논리 표현이 음수로 표시됩니다. 예를 들어 앞에 /1/1/ 오는 노드를 .로 /1/-1/나타낼 수 있습니다. 노드에는 선행 0이 있을 수 없습니다. 예를 들어 /1/1.1/ 유효하지만 /1/1.01/ 유효하지는 않습니다. 오류가 발생하지 않도록 하려면 GetDescendant 메서드를 사용하여 노드를 삽입합니다.
데이터 형식 변환
hierarchyid 데이터 형식은 다음과 같이 다른 데이터 형식으로 변환할 수 있습니다.
ToString 메서드를 사용하여 hierarchyid 값을 nvarchar(4000) 데이터 형식으로 논리적 표현으로 변환합니다.
CSharp 및 Write를 사용하여 읽기(데이터베이스 엔진)를 사용하여hierarchyid를 varbinary로 변환합니다.
SOAP 를 통해 hierarchyid 매개 변수를 전송하려면 먼저 문자열로 캐스팅합니다.
데이터베이스 업그레이드
데이터베이스를 최신 버전의 SQL Server로 업그레이드하면 새 어셈블리와 hierarchyid 데이터 형식이 자동으로 설치됩니다. 업그레이드 관리자 규칙에서는 이름이 충돌하는 사용자 형식이나 어셈블리를 검색합니다. 업그레이드 관리자는 충돌하는 어셈블리의 이름을 변경하고 충돌하는 형식의 이름을 바꾸거나 코드에서 두 부분으로 구성된 이름을 사용하여 기존 사용자 유형을 참조하는 것이 좋습니다.
데이터베이스 업그레이드에서 이름이 충돌하는 사용자 어셈블리를 검색하면 해당 어셈블리의 이름이 자동으로 바뀌고 데이터베이스가 의심 모드로 전환됩니다.
업그레이드 중에 이름이 충돌하는 사용자 형식이 발견된 경우에는 특별한 조치가 취해지지 않습니다. 업그레이드 후에는 이전 사용자 유형과 새 시스템 유형이 모두 존재합니다. 사용자 유형은 두 부분으로 구성된 이름을 통해서만 사용할 수 있습니다.
복제된 테이블에서 hierarchyid 열 사용
hierarchyid 형식의 열은 복제된 모든 테이블에서 사용할 수 있습니다. 애플리케이션의 요구 사항은 복제가 단방향인지 양방향인지, 사용된 SQL Server 버전이 무엇인지에 따라 달라집니다.
단방향 복제
단방향 복제에는 구독자에서 변경되지 않는 스냅샷 복제, 트랜잭션 복제 및 병합 복제가 포함됩니다. hierarchyid 열이 단방향 복제에서 어떻게 작동하는지는 구독자가 실행 중인 SQL Server 버전에 따라 달라집니다.
SQL Server 게시자는 특별히 고려할 사항 없이 hierarchyid 열을 같은 버전의 SQL Server 구독자에 복제할 수 있습니다.
SQL Server 게시자는 hierarchyid 열을 변환하여 SQL Server Compact 또는 이전 버전의 SQL Server를 실행하는 구독자에 복제해야 합니다. SQL Server Compact 및 이전 버전의 SQL Server는 hierarchyid 열을 지원하지 않습니다. 이러한 버전 중 하나를 사용하는 경우에도 구독자에 데이터를 복제할 수 있습니다. 이렇게 하려면 열을 호환되는 데이터 형식으로 변환할 수 있도록 스키마 옵션이나 게시 호환성 수준(병합 복제의 경우)을 설정해야 합니다.
열 필터링은 이러한 두 가지 시나리오에서 모두 지원됩니다. 여기에는 hierarchyid 열 필터링도 포함됩니다. 필터에 hierarchyid 열이 포함되지 않는 한 행 필터링이 지원됩니다.
양방향 복제
양방향 복제에는 변경 내용이 구독자에 적용되는 병합 복제와 구독이 업데이트되는 트랜잭션 복제, 피어 투 피어 트랜잭션 복제가 포함됩니다. hierarchyid 열이 있는 테이블을 양방향 복제에 맞게 구성할 수 있습니다. 다음 요구 사항 및 고려 사항을 유의하세요.
게시자와 모든 구독자는 SQL Server 2016(13.x) 이상 버전에서 동일한 버전을 실행해야 합니다.
복제는 데이터를 바이트로 복제하고 계층의 무결성을 보장하기 위해 유효성 검사를 수행하지 않습니다.
원본(구독자 또는 게시자)에서 변경된 내용의 계층 구조는 대상에 복제할 때 유지 관리되지 않습니다.
hierarchyid 열의 값은 모든 데이터베이스에서 동일한 이진 표현을 가질 수 있습니다. 애플리케이션 논리가 서로 다른 엔터티에 대해 동일한 계층 구조를 독립적으로 생성할 때 양방향 복제에서 충돌이 발생할 수 있습니다. 따라서 게시자와 구독자에 동일한 값이 생성되더라도 서로 다른 행에 적용될 수 있습니다. 복제는 이 조건을 확인하지 않으며 열에 대한 값과 같이
IDENTITY열 값을 분할하는 기본 제공 방법이 없습니다. 애플리케이션에서는 제약 조건 또는 기타 메커니즘을 사용하여 이러한 감지되지 않는 충돌을 피해야 합니다.구독자에 삽입된 행은 분리될 수 있습니다. 삽입된 행의 부모 행은 게시자에서 삭제될 수 있습니다. 이렇게 되면 구독자의 행이 게시자에 삽입될 때 감지되지 않은 충돌이 발생합니다.
열 필터는 nullable이 아닌 hierarchyid 열을 필터링할 수 없습니다. 게시자의 hierarchyid 열에 대한 기본값이 없으므로 구독자의 삽입이 실패합니다.
필터에 hierarchyid 열이 포함되지 않는 한 행 필터링이 지원됩니다.