2010-05-15 6 views
0

다른 두 HierarchyID 사이에 새 HierarchyID를 요청하면 결과가 점차 길어집니다. 예를 들어, 2/5.6에서 2/5.7 사이에는 2/5.6.1과 다른 4 가지 구성 요소 경로 만 있습니다. HierarchyID 데이터 형식은 800 바이트로 제한되어 있으므로이 작업을 영원히 반복 할 수 없습니다. 다시, 정수 타입도 제한되어 있지만 실제로는 문제가되지 않습니다. 높이가 무한대로 커지지 않도록 테이블을 조각 모음해야합니까?HierarchyID가 부족하다는 것에 대해 걱정해야합니까?

답변

1

hierarchyid이 새로운 ID를 "추가"하여 중간 상태 (예 : /2/5.6/)를 사용하지 않는 것이 "우수 사례"로 간주됩니다. hierarchyid이 클러스터 된 기본 키이고 성능에 좋지 않으면 uniqueidentifier과 비슷한 방식으로 페이지가 분할됩니다.

아이들을 순차적으로으로 생성하는 경우, 아이들을 걱정할 필요가 거의 없습니다. 당신은 각자 에 대해 수백만 명의 어린이를 가질 수 있습니다. 각각 부모입니다. 이 방법으로 ID를 생성하는 경우

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 
BEGIN TRANSACTION 
    UPDATE Hierarchy 
    SET @LastChild = LastChild = HId.GetDescendant(LastChild, NULL) 
    WHERE HId = @ParentID 

    INSERT Hierarchy (HId, ...) 
    VALUES (@LastChild, ...) 
COMMIT 

가, 나머지는 당신을 걱정할 필요가 없을거야 보장 :

Here 당신이 hierarchyid 값을 생성 할 것으로 예상하고 방법의 예입니다.


호기심 때문에, 나는 당신이 얼마나 깊이 갈 수 있는지를 알아보기 위해 빠른 테스트를 실시했습니다. 즉 "에-사이에"노드를 만들 수있는 얼마나 많은에 대한 최악의 경우 제한 최악의 경우는 그래서

DECLARE 
    @parent hierarchyid, 
    @child hierarchyid, 
    @high hierarchyid, 
    @cnt int 

SET @parent = '/1/' 
SET @child = @parent.GetDescendant(NULL, NULL) 
SET @cnt = 0 

WHILE (@@ERROR = 0) 
BEGIN 
    SET @cnt = @cnt + 1 
    PRINT CAST(@cnt AS varchar(10)) + ': ' + @child.ToString() 
    SET @high = @parent.GetDescendant(@child, @high) 
    SET @child = @parent.GetDescendant(@child, @high) 
END 

당신은 그것이 1426의 포인트 중첩 수준에서 오류가 밖으로 볼 수있다, 다음은 테스트 스크립트입니다은 모든 삽입이 두 개의 가장 깊게 중첩 된 노드 사이에 있음을 의미합니다.

의견에서 언급했듯이이 한계를 맞추기는 꽤 어렵지만 여전히 시도해 보는 것은 좋지 않습니다. 실제 바이트 길이는 점점 더 많은 "포인트"를 사용하면 성능이 저하됩니다. hierarchyid이 클러스터 된 색인 인 경우 은 페이지 분할에 의해 번을 처리합니다. 상위 노드로 순위를 매기려면 순위 열을 대신 사용하십시오. 은 나중에 더 이상 SELECT에서 정렬하는 것보다 효율적이며 트랜잭션 분리 및 기타 이러한 두통에 대해 걱정해야하는 INSERT 중에 수행하는 것이 더 쉽습니다.

+0

내 응용 프로그램이 순위를 유지하고 있습니다. 나는 실제로 내 경로에 "/"를 쓸 필요가 없다. 기존 요소들 사이에 삽입하는 것이 중요합니다. –

+0

@ 브루노 : 당신은 정말로'hierarchyid'를 아이들의 특정한 순서를 유지하는 방법으로 생각해서는 안됩니다. 네, 그렇게 할 수있는 능력이 있습니다. 그러나 그 경우에는 최적화되지 않았습니다. 순위를 원하면 순위 열을 추가하십시오. (추신 : 나는 당신이 슬래시가 필요 없다고 말할 때 당신이 의미하는 바를 모르겠다. "hierarchyid"에 실제 "슬래시"가 없다. 단지 문자열 표현 일 뿐이다.) – Aaronaught

+0

당신은 어떤 타입을 제안하나요? 순위에 사용하여 어떤 쌍 사이에 삽입 할 수 있습니까? –

관련 문제