프로덕션에서 HierarchyId를 사용하는 사람이 있습니까? 신뢰할 수 있습니까?


21

실제 생산에서 수천 행이 넘는 합리적인 크기의 테이블로 HierarchyId를 사용하고 있습니까? 신뢰할 수 있고 성능이 좋습니까? 지금까지 나는 공급 업체에 가입하지 않은 사람이 추천 발견하지 않은, 폴 닐슨은 그것에 대하여 조언 여기 .

실제 프로덕션 시스템에서 HierarchyId를 사용한 경험은 무엇입니까?

대안 대신 HierarchyId를 선택할 때 사용한 기준은 무엇입니까?

답변:


8

HierarchyID를 구현했으며 좋은 성능과 사용하기 쉬운 것으로 나타났습니다.

나는 최대 10 가지의 계층 구조를 가진 비교적 작은 데이터 세트 (수만 행)에 사용했습니다.

왜 사용합니까? HierarchyID 유형은 IsDescendantOf자체 구체화 된 경로를 롤링하는 것보다 작업을보다 쉽게 해주는 여러 가지 도우미 메서드 (예 :)를 제공합니다 .

StackOverflow에 대한 Paul Nielsen의 의견은 혼란 스럽습니다. HierarchyID 는 구체화 된 경로입니다. 그의 답변 아래 에이 의견 에 동의하는 경향 이 있습니다.

더 좋은 질문은 '사용하지 않는 이유'입니다. 사용하기 쉽고, 직접 작성해야 할 많은 기능을 제공하며, 제한된 테스트에서 잘 수행됩니다.


+1 데이터의 무결성을 어떻게 보장합니까? 고아가 없는지 확인하기 위해 제약 조건을 사용할 수 있습니까?
— AK

3
메모리에서 할 수 있습니다. HierarchyID에서 함수를 사용하여 부모 값을 결정하고 해당 값에 대해 지속 계산 열을 만든 다음 해당 값과 부모간에 FK 제약 조건을 적용합니다.
— 커크 브로드 허스트

5

이것은 Kirk의 '사용하지 않는 이유 (HierarchyId)'에 대한 답변입니다. 구체화 된 경로와 비교할 때 일부 중요한 경우 HierarchyId는 성능이 떨어지고 작업하기 편리하지 않은 것으로 보입니다.

그 이유는 간단합니다. Connect에 대한 Microsoft 의견의 인용 에 따르면, "문제는 hierarchyID의 메소드를 포함한 CLR 호출이 쿼리 최적화 프로그램에 불투명하기 때문입니다. 이것은 의도적으로 설계된 것입니다. 그러나 때때로 카디널리티 추정치가 상당히 클 수 있습니다. 잘못된."

다른 한편으로, 구체화 된 경로를 구현하는 것은 우리가 처음으로해야 할 때 매우 쉽고, 다음에는 본질적으로 복사하여 붙여 넣기 작업입니다. 따라서 적은 노력으로보다 다양하고 우수한 성능의 솔루션을 얻을 수 있습니다.

그래서 저는 "Microsoft® SQL Server® 2008 Bible"이라는 제목의 훌륭한 저서에 다음과 같이 썼던 Paul Nielsen에 전적으로 동의합니다. "새로운 HierarchyID는 논쟁의 여지가 없습니다. 다른 솔루션이 필요한 문제인지 확실하지 않습니다. "


3

우리 회사는 직접 판매, 다단계 마케팅 소프트웨어에서 HeirachyID를 사용합니다. 작동합니다. 나는 실제로 어떤 작업을 수행하지 않았으며 우리가 사용하고 있음을 알고 있습니다.

내가 본 가장 큰 문제는 더 많은 설정 기반이 아닌 반복 방식으로 레벨을 반복한다는 것입니다. 이 영역에서는 실제로 성능이 좋지 않지만 유형이나 구현에 문제가 있는지 확실하지 않습니다.


잭, 테이블이 얼마나 큽니까? 대안에 HierarchyId를 어떻게 사용하기로 선택 했습니까?
— AK

이메일 알림을 사용하도록 설정하지 않았으므로이 댓글을 보지 못했습니다. 우리의 테이블은 현재 수백만이 아닌 수십만에 있습니다. HierarchyID를 사용하기로 결정했을 때 회사와 함께하지 않았으므로 당시의 새로운 방법이 아닌 다른 이유를 선택했는지 잘 모르겠습니다.
— Jack Corbett

1

hierarchyid의 한 가지 문제는 공급 업체를 잠그는 것입니다. 그러나 Adam Milazzo가 모든 것이 내부적으로 작동하는 방식에 대한 훌륭한 기사를 찾았습니다.

http://www.adammil.net/blog/view.php?id=100

이를 통해 MSSQL에서 내 데이터 세트를 변환하는 Postgres 스크립트를 작성할 수있었습니다. 또한 AdventureWorks 데이터베이스를 Postgres로 가져 오기 위해 작성한 스크립트에 포함했습니다.

https://github.com/lorint/AdventureWorks-for-Postgres

install.sql 파일에서 "hierarchyid"를 검색하면 곧 변환에 대한 참조를 찾을 수 있습니다.


0

우리 팀은 프로덕션 환경에서 구현했으며, 처음에는 성능이 좋았습니다 .2 년 후에는 테이블에 430,000 개의 행과 getroot가 있고 getdecendent는 3 초가 걸리며 두 레코드 모두 레코드 삽입을위한 다음 Id 값을 계산하는 데 필요합니다. 이제 단일 하위 트리 삽입에 약 16 초가 걸리므로 전혀 허용되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.