본문 바로가기
Dev/Oracle

[Oracle] 인덱스 구조

by 흰바다제비 2022. 6. 21.
728x90

인덱스

기본 구조

 

  • 루트 블록
  • 브랜치 블록
    • 하위 노드 블록을 찾아가기 위한 Data Block Address를 갖는다.
  • 리프 블록 : 가장 마지막 레벨의 블록
    • 인덱스 키 컬럼, 주소 정보(ROWID)를 갖는다.

※ ROWID : 해당 테이블 레코드를 찾아가기 위한 주소 정보. 데이터파일 번호, 블록 번호, 로우 번호 같은 테이블 레코드의 물리적 위치 정보를 포함.

확장 ROWID 포맷

  • 데이터 오브젝트 번호(6자리) : 데이터베이스 세그먼트를 식별하기 위해 사용되는 번호
  • 데이터파일 번호(3자리) : 로우가 속한 데이터 파일 번호
  • 블록 번호(6자리) : 해당 로우가 저장된 데이터 블록 번호
  • 로우번호 (3자리) : 블록 내에서 각 로우에 붙여진 일련번호로서, 0부터 시작

 

## ROWID 확인
 SELECT ROWID EXTENDED_FORMAT,
           DBMS_ROWID.ROWID_TO_RESTRICTED(ROWID, 0) RESTRICTED_FORMAT,
           DBMS_ROWID.ROWID_OBJECT(ROWID) OBJECT,
           DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILE_NO,
           DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK_NO,
           DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) ROW_NUMBER
 FROM SCOTT.EMP E
 WHERE EMPNO = 7698;
  
>>

EXTENDED_FORMAT    RESTRICTED_FORMAT      OBJECT    FILE_NO   BLOCK_NO ROW_NUMBER
------------------ ------------------ ---------- ---------- ---------- ----------
AAAF4MAAEAAAACUAAF 00000094.0005.0004	   24076	  4	   148	        5


----------------------------------------------------------------------------------


 SELECT DBMS_ROWID.ROWID_TYPE('AAAM6PAAEAAAE2cAAA') EXTENDED_FORMAT,
        DBMS_ROWID.ROWID_TYPE('00004D9C.0000.0004') RESTRICTED_FORMAT
 FROM DUAL;

>>

EXTENDED_FORMAT RESTRICTED_FORMAT
--------------- -----------------
              1                 0

 


인덱스 탐색

  • 수직적 탐색

: 수평적 탐색을 위한 시작 지점 찾기

  루트 -> 리프 블록

  (아래쪽으로 진행 ↓)

  • 수평적 탐색

: Range Scan. 범위 스캔

  인덱스 레코드 간 논리적 순서에 따라 리프 블록 스캔

  (좌->우  / 우->좌 로 진행)

 

  • 탐색 과정
    • 수직적 → 수평적

루트 블록에서 시작

→ 찾고자 하는 값보다 크거나 같은 값을 만나면 바로 직전 레코드가 가리키는 하위 블록으로 이동 (수직적)

→ 이 과정을 반복하며 조건을 만족하는 첫 번째 블록을 찾는다.

※ 리프 블록이므로 해당하는 데이터를 찾거나, 해당하는 데이터가 없어 찾지 못하는 2가지의 경우만 있다. 찾으면 수평적 탐색 과정으로 넘어가고, 못 찾으면 인덱스 탐색을 마친다.

 

수직적 탐색을 통해 스캔 지점을 찾고 나면, 데이터가 더 나타나지 않을 때까지 리프 블록을 수평적으로 스캔한다

→ 조건절에 만족하는 데이터를 찾는 과정

→ 만족하는 데이터를 모두 찾고 ROWID 값을 얻는다.

→ ROWID를 이용해서 해당 테이블의 레코드에 접근한 후 필요한 다른 컬럼 값들을 읽는다. (인덱스 컬럼만 필요한 경우 생략)

 

 

http://wiki.gurubee.net/pages/viewpage.action?pageId=26739921

 

1. 인덱스 구조 - [종료]구루비 DB 스터디 - 개발자, DBA가 함께 만들어가는 구루비 지식창고!

(1) 범위 스캔 인덱스는 키 컬럼 순으로 정렬돼 있기 때문에 특정 위치에서 스캔을 시작해 검색 조건에 일치하지 않는 값을 만나는 순간 멈추는데, 이것이 Range Scan이다. (2) 인덱스 기본 구조 루트

wiki.gurubee.net

 

728x90

'Dev > Oracle' 카테고리의 다른 글

[Oracle] 인덱스 탐색 방식  (0) 2022.06.21
[Oracle] 결합 인덱스  (0) 2022.06.21
[Oracle] 복구한 DB 원복  (0) 2022.06.20
[Oracle] RMAN 복구  (0) 2022.06.19
[Oracle] RMAN Backup  (0) 2022.06.17

댓글