메뉴 건너뛰기

bysql.net

2.1. B-tree 인덱스

2010.10.04 20:55

김진희 조회 수:13018

2.1. B-Tree 인덱스


2.1.1. B-Tree인덱스 

  • 관계형데이터베이스의 기본적인 인덱스, Key값이 많을경우 사용에 이점이 된다.
  • 특징: 테이블의 로우가 어떤 위치에 있든 동일한 처리방법과 속도로 접근할 수 있다
    • 나무구조(Tree)처럼 가지에 해당하는 브랜치 블럭과 잎사귀에 해당하는 리프 블럭이 있다.
    • 리프블록 < 브랜치블록  < root블록
    • unique Scan일 경우 바로 테이블을 엑세스 하고 멈추지만,
    • 범위 스캔일 경우 root블록->브랜치블록->리프블록 으로 스캔한다.

 

2_1_1_1.jpg


Range Scan일 경우

  • 인덱스는 구성컬럼과 ROWID로 정렬되어 있다. ROWID에는 로우가 저장된 블록의 주소, 로우의 슬롯번호가 기록되어 있다.
  • 처리할 범위의 첫번째 인덱스로우를 브랜체블록을 통해 리프블록을 액세스한 다음 거기의 ROWID로 블록을 찾는다.
    SGA부터 찾아보고 없으면 디스크에 액세스해서 복사본을 SGA에 복사한다
  • 새롭게 액세스한 데이터블록정보를 PGA로 가져와서 해당 SQL의 처리버퍼에 넣는다 (일명 원 버퍼)
  • 인덱스블록을 액세스한 내용을 PGA버퍼에서 찾아 다른 조건까지 검증하여 성공한 로우만 운반단위로 보낸다 만약 클러스터링 팩터가 좋다면 여러건의 인덱스 스캔을 하나의 버퍼에서 처리할 수 있다.
  • PGA버퍼에서 찾을 수 없다면 다시 다른 블록을 SGA에 액세스하여 새로운 블럭을 담고 위의 처리를 반복수행한다.
  • 리프블록에서 액세스한 로우가 처리범위를 넘으면 처리를 종료한다.


2_1_1_2.jpg



2.1.2. B-Tree 인덱스의 조작
1. 인덱스 생성(Creation)

2_1_2_1.jpg 

  1. 테이블을 액새스하여 정렬을 수행
  2. 정렬된 결과를 인덱스 세그먼트의 리프 블록에 기록하기 시작
  3. 리프블록이 PCTFREE에 도달하여 새로운 블록을 요구하게 되면 브랜치블록을 생성
  4. 리프블록이 증가함에 따라 브랜치블록도 채워져 가다 블랜치블록이 PCTFREE에 도달하면 새로운 리프블록과 새로운 브랜치블록을 생성할때 루트블록이 생성된다
  5. 새로운 브랜치블록이 만들어질 때마다 루트블록에 브랜치블록의 DBA정보를 기록한다.

다음과 같은 방법으로 인덱스가 저장되기 때문에 인덱스 블럭에 많은 로우를 담게 될 경우

1) 리프블럭 감소

2) 브랜치 블럭의 깊이 감소가 일어날 수 있다.

그러므로 인덱스 컬럼 수 ↓, 큰 블럭 사이즈 지정, PCTFREE 최소 로 정의한다.

인덱스 블럭의 분할

 인덱스 로우는 정렬이 되어 저장 되어야 하는 이유 때문에

 이미 생성된 구조에 새로운 로우가 삽입되면 기존의 위치에 파고 들어가는 문제 발생

2_1_2_2.jpg 
1. 마지막 값 삽입 : PCTFREE에 도달한 블럭일 경우엔 새로운 블럭에 등록
2. 중간값 삽입 : PCTFREE가 초과하게 되므로 분할이 발생, 2개의 블럭으로 수정되는데 2/3만 채우면서 양쪽 모두 재편 
* 분할이 일어난 블럭에 새로운 값이 들어오지 않으면 저장공간 낭비 => 인덱스 재생성이 효율적이다.
 
인덱스를 경유한 검색


2_1_2_3.jpg 
  • 루트 블록을 찾는다.
  • 주어진 값보다 같거나 최소값을 찾는다.(찾는값 >= 인덱스값)
    -. 찾는 값 < 인덱스 값 (Lmc에 있는 dba로 이동)
    -. 찾는 값 = 인덱스 값 (해당 dba로 이동)
    -. 찾는 값 > 인덱스 값 (검색 후 찾는 값 = 인데스 값이면 해당 dba로 이동 그렇지 않으면, 찾는 값 < 인데스 값을 만족하는 인덱스 최소값)
  • 리프 블록을 찾을 때까지 ② 의 단계를 반복해서 수행
  • 리프 블록에서 주어진 값을 가진 키를 찾아 존재하면 ROWID를 이용해 테이블을 액세스하고, 그렇지 않으면 'No Data found'로 결과 반환 만약, col2의 조건을 'ACC'가 아닌 'AC%'로 바꾸면
  • Col1 = 'B'이면서 Col2 = 'AC'보다 같거나 큰 것에서 스캔을 시작, 'AD' 보다 작으면 테이블을 액세스하고, 그렇지 않으면 종료한다.

* lmc는 브랜치 블럭의 첫 번째 로우의 값보다 적은 값을 갖는 하위의 블럭의 주소정보(dba:data block address)를 말한다.

2.1.3. 리버스 키 인덱스 
2_1_3_1.jpg
  • 어떤 컬럼값의 각 바이트의 위치를 역전시키는 것을 말한다.
  • 리버스키 인덱스에서는 정렬이 크게 달라지므로 클러스터링 팩터가 나빠진다는 것을 의미한다.
  • '='로만 액세스하는 경우에라면 크게 문제되것이 없다


  • 번호 제목 글쓴이 날짜 조회 수
    35 Front Page file 운영자 2010.09.06 164252
    34 3.1. SQL과 옵티마이져 (3/3) (3.1.3 ~ 3.1.5) [2] file 실천하자 2010.10.08 26956
    33 4.1. 인덱스의 선정 기준 (1/2) (4.1.1.~4.1.5.) [2] file 노랑배 2010.11.13 23370
    32 2.2. 비트맵(Bitmap) 인덱스 file 실천하자 2010.10.04 20927
    31 1.4. 부분범위처리로의 유도(1/2) (1.4.1 ~ 1.4.8) file 실천하자 2010.11.26 19346
    30 2.3. 함수기반 인덱스(FBI, Function-Based Index) pranludi 2010.10.01 18679
    29 4.1. 인덱스의 선정 기준 (2/2) (4.1.6.) [1] file 실천하자 2010.11.15 16804
    28 2.3.조인 종류별 특징 및 활용방안 (3/4) (2.3.4~2.3.5) 실천하자 2010.12.08 15346
    27 1.4. 부분범위처리로의 유도(1/2) (1.4.9) 실천하자 2010.12.08 14430
    26 1.1. 테이블과 인덱스의 분리형 file 실천하자 2010.09.13 13905
    25 3.1. SQL과 옵티마이져 (2/3) (3.1.2.3 ~ 3.1.2.5) 노랑배 2010.10.06 13722
    » 2.1. B-tree 인덱스 file 김진희 2010.10.04 13018
    23 3.2.4. 비트맵(Bitmap) 실행계획 file 실천하자 2010.11.08 12833
    22 2.3.조인 종류별 특징 및 활용방안 (2/4) (2.3.2~2.3.3) file 실천하자 2010.12.03 12561
    21 제1장. 부분범위처리(Partial range scan) file supersally 2010.12.01 12321
    20 2.1.조인과 반복연결(loop query)의 비교 pranludi 2010.12.05 11447
    19 3.2.5. 기타 특수한 목적을 처리하는 실행계획 pranludi 2010.11.09 11332
    18 3.3. 실행계획의 제어 file supersally 2010.11.08 11134
    17 3.2.1. 스캔(Scan)의 기본유형 [1] pranludi 2010.10.19 11072
    16 3.2.3. 연산 방식에 따른 실행계획 노랑배 2010.10.18 10897