답변:
아래 이미지는 B + 트리와 B 트리의 차이점을 보여줍니다.
B + 나무의 장점 :
B 나무의 장점 :
B 트리보다 B + 트리의 주요 장점은 데이터에 대한 포인터를 제거하여 팬 아웃을 높이고 트리 깊이를 잠재적으로 줄임으로써 다른 노드에 대한 더 많은 포인터를 넣을 수 있다는 것입니다.
단점은 내부 노드에서 일치하는 것을 발견했을 때 초기 결과가 없다는 것입니다. 그러나 두 데이터 구조 모두 팬 아웃이 많으므로 대부분의 일치 항목이 리프 노드에 배치되어 평균 B + 트리가 더 효율적입니다.
터미널 노드가 연결된 목록을 형성하기 때문에 트리가 인덱싱하는 모든 데이터를 살펴 보듯이 B + 트리는 전체 스캔을 수행하는 것이 훨씬 쉽고 성능이 뛰어납니다. B-Tree로 전체 스캔을 수행하려면 모든 데이터를 찾기 위해 전체 트리 순회를 수행해야합니다.
반면에 B- 트리는 트리가 RAM 또는 다른 비 블록 스토리지에 상주 할 때 키를 사용하여 특정 데이터를 찾는 경우 더 빠를 수 있습니다. 트리에서 일반적으로 사용되는 노드를 올릴 수 있으므로 데이터를 얻는 데 필요한 비교가 적습니다.
데이터베이스 시스템 개념의 예 5
B + 트리
해당 B- 트리
Clearview bucket
받는 사람을 Mianus Bucket
. 어쨌든 두 Downtown bucket
트리 사이에서 B- 트리에서 인덱스 스캔을 수행하려는 경우 검색 대상이 많으므로 역 추적이 필요 하기 때문에 그렇게하는 것은 의미가 없습니다 . 이거 어디서 났어?
Adegoke A, Amit
사람들이 누락 한 중요한 점은이 섹션에서 설명한 데이터와 포인터의 차이점이라고 생각합니다.
포인터 : 다른 노드를 가리키는 포인터.
데이터 :-데이터베이스 인덱스의 맥락에서 데이터는 다른 곳에 존재하는 실제 데이터 (행)에 대한 또 다른 포인터 일뿐입니다.
따라서 B 트리의 경우 각 노드에는 세 개의 정보 키, 키와 관련된 데이터에 대한 포인터 및 자식 노드에 대한 포인터가 있습니다.
B + 트리에서 내부 노드는 하위 노드에 대한 키와 포인터를 유지하고 리프 노드는 관련 데이터에 대한 키와 포인터를 유지합니다. 이것은 주어진 크기의 노드에 대해 더 많은 키를 허용합니다. 노드의 크기는 주로 블록 크기에 의해 결정됩니다.
노드 당 더 많은 키를 갖는 장점은 위에 설명되어 있으므로 입력 노력을 절약 할 수 있습니다.
B + 트리는 블록 기반 스토리지 (예 : 하드 디스크)에서 특히 좋습니다. 이것을 염두에두고, 예를 들어 (내 머리 꼭대기에서) 몇 가지 이점이 있습니다.
높은 팬 아웃 / 낮은 깊이 : 즉, 데이터를 얻기 위해 더 적은 블록을 가져와야합니다. 포인터와 데이터가 혼합 된 경우 각 읽기마다 포인터가 줄어들므로 데이터를 찾으려면 더 많은 검색이 필요합니다
간단하고 일관된 블록 스토리지 : 내부 노드에는 N 개의 포인터가 있고, 리프 노드에는 데이터가 있으며, 아무것도 없습니다. 구문 분석, 디버그 및 재구성이 쉬워집니다.
높은 키 밀도는 최상위 노드가 거의 확실히 캐시에 있음을 의미하며 많은 경우 모든 내부 노드가 빠르게 캐시되므로 데이터 액세스 만 디스크로 이동해야합니다.
**
B-Tree의 주요 단점은 키를 순차적으로 순회하는 것이 어렵다는 것입니다. B + Tree는 B-Tree의 빠른 랜덤 액세스 속성을 유지하면서 빠른 순차적 액세스를 허용합니다.
** 참고 : C // Author를 사용한 데이터 구조 : Aaro M Tenenbaum
예를 들어 행당 데이터가 많은 테이블이 있습니다. 즉, 객체의 모든 인스턴스가 크다는 것을 의미합니다.
여기서 B 트리를 사용하는 경우 대부분의 시간은 데이터가 포함 된 페이지를 스캔하는 데 소비됩니다. 데이터베이스에서 B + 트리를 사용하여 오브젝트 데이터 스캔을 피하는 이유입니다.
B + 트리는 데이터와 키를 분리합니다.
그러나 데이터 크기가 작 으면 B 트리가하는 키로 저장할 수 있습니다.
B- 트리와 B + 트리의 주요 차이점은 B- 트리가 검색 키 값의 중복 저장을 제거한다는 것입니다 .B- 트리에서 검색 키가 반복되지 않으므로 더 적은 수의 트리 노드를 사용하여 인덱스를 저장할 수 없습니다 그러나 리프가 아닌 노드에 나타나는 검색 키가 B- 트리의 다른 곳에 나타나지 않으므로 리프가 아닌 노드의 각 검색 키에 대한 추가 포인터 필드를 포함해야합니다. 반복이 발생하지 않고 큰 인덱스에 사용될 수 있기 때문에 B- 트리의 공간 이점입니다.
B + 트리는 나무의 뿌리에서 잎까지의 모든 경로의 길이가 같은 균형 잡힌 나무이며, 나무의 각 비잎 노드는 [n / 2]와 [n]의 자식을 가지며, 여기서 n은 특정 나무에 고정. 색인 페이지와 데이터 페이지가 포함되어 있습니다. 이진 트리에는 부모 노드 당 두 개의 자식 만 있고 B + 트리에는 각 부모 노드에 대해 다양한 수의 자식이있을 수 있습니다.
B + 트리를 사용할 수있는 한 가지 방법은 트리가 너무 커져 사용 가능한 메모리에 맞지 않는 상황에 적합하다는 것입니다. 따라서 일반적으로 여러 I / O를 수행해야합니다.
B + 트리가 실제로 메모리에 맞는 경우에도 B + 트리가 사용되는 경우가 종종 있으며, 그런 다음 캐시 관리자가이를 영구적으로 유지할 수 있습니다. 그러나 이것은 일반적인 경우가 아닌 특별한 경우이며 캐싱 정책은 B + 트리 유지 관리와 별개입니다.
또한 B + 트리에서 리프 페이지는 연결 목록 (또는 이중 연결 목록)으로 서로 연결되어 순회를 최적화합니다 (범위 검색, 정렬 등). 따라서 포인터 수는 사용되는 특정 알고리즘의 함수입니다.