다른 두 HierarchyID 사이에 새 HierarchyID를 요청하면 결과가 점차 길어집니다. 예를 들어, 2/5.6에서 2/5.7 사이에는 2/5.6.1과 다른 4 가지 구성 요소 경로 만 있습니다. HierarchyID 데이터 형식은 800 바이트로 제한되어 있으므로이 작업을 영원히 반복 할 수 없습니다. 다시, 정수 타입도 제한되어 있지만 실제로는 문제가되지 않습니다. 높이가 무한대로 커지지 않도록 테이블을 조각 모음해야합니까?HierarchyID가 부족하다는 것에 대해 걱정해야합니까?
답변
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
중에 수행하는 것이 더 쉽습니다.
- 1. Windows 클립 보드에 많은 양의 데이터를 저장하는 것에 대해 걱정해야합니까?
- 2. NSUserDefaults의 충돌에 대해 걱정해야합니까?
- 3. .NET 코드의 난독 화에 대해 걱정해야합니까?
- 4. 가짜 계정/웹 사이트의 로그인에 대해 걱정해야합니까?
- 5. 특정 Java.exe를 죽이는 것에 대해
- 6. Entity Framework의 HierarchyID가 작동하지 않습니다.
- 7. 파인더에서 'self'를 호출하는 것에 대해 혼란스러워합니다.
- 8. playframework에 검색 기능을 구현하는 것에 대해 의문이있다.
- 9. 클래스에 객체를 전달하는 것에 대해 확신이 없습니다.
- 10. Apache + mod_python에서 Django 프로젝트를 배포하는 것에 대해
- 11. log4net : 로거를 동적으로 생성합니다. 걱정해야합니까?
- 12. "윈도우가 정의되지 않았습니다"JSLint strict 모드 에러에 대해 걱정해야합니까?
- 13. 프로세스 goup의 프로세스가 신호를 수신하는 순서에 대해 걱정해야합니까?
- 14. ASP.NET : 특정 상황에서 메모리 누수에 대해 걱정해야합니까? [C 번호]
- 15. iOS 응용 프로그램에서 스레드 안전성에 대해 언제 걱정해야합니까?
- 16. SEO에 대한 RSS URL을 걱정해야합니까?
- 17. 개발자가 서버 구성에 대해 걱정할 필요가 없습니까? 우리가 이것에 대해 걱정해야합니까?
- 18. 여러 데이터베이스에 연결하여 성능을 걱정해야합니까?
- 19. 액세스 증가 프론트 엔드 : 걱정해야합니까?
- 20. 클릭 후 공유 지점의 웹 파트에 초점을 맞추는 것에 대해
- 21. 스택 트레이스를 특별한 로그 테이블에 저장하는 것에 대해 어떻게 생각하십니까?
- 22. XML 직렬화에 클래스를 구현하는 것에 대해 혼란 스럽습니다.
- 23. Facebook 그래프 api가 좋아하는 것에 대해 빈 결과를 제공합니다.
- 24. 동적으로 추가 된 사용자 콘트롤로 ViewState를 사용하는 것에 대해 혼란스러워합니다.
- 25. 성명 결과 대신 선택 객체를 반환하는 것에 대해 어떻게 생각하십니까?
- 26. PHP에 대한 질문에 단어에 하이픈을 추가하는 것에 대해
- 27. 정확히 왜 regasm은 강력한 이름으로 서명하는 것에 대해 경고합니까?
- 28. Silverlight를 사용하여 비즈니스 응용 프로그램을 만드는 것에 대해
- 29. 홈 버튼을 누르고 마지막 활동에서 다시 시작하는 것에 대해
- 30. setjmp와 longjmp를 래핑하는 것에 대해 이상한 점은 무엇입니까?
내 응용 프로그램이 순위를 유지하고 있습니다. 나는 실제로 내 경로에 "/"를 쓸 필요가 없다. 기존 요소들 사이에 삽입하는 것이 중요합니다. –
@ 브루노 : 당신은 정말로'hierarchyid'를 아이들의 특정한 순서를 유지하는 방법으로 생각해서는 안됩니다. 네, 그렇게 할 수있는 능력이 있습니다. 그러나 그 경우에는 최적화되지 않았습니다. 순위를 원하면 순위 열을 추가하십시오. (추신 : 나는 당신이 슬래시가 필요 없다고 말할 때 당신이 의미하는 바를 모르겠다. "hierarchyid"에 실제 "슬래시"가 없다. 단지 문자열 표현 일 뿐이다.) – Aaronaught
당신은 어떤 타입을 제안하나요? 순위에 사용하여 어떤 쌍 사이에 삽입 할 수 있습니까? –