해당 글은 전적으로 [ 꿈꾸는 개발자, DBA 커뮤니티 구루비 ] 에서 참고하였음을 밝힙니다. 개인 공부 및 기록을 위한 글입니다. 따라서 옮기는 과정에서 경어체는 모두 제거하였으며, 본인의 관점으로 글을 작성하였습니다. 상세하고 정돈된 내용은 하단에 참고링크를 보시길 바랍니다.


데이터베이스의 인덱스를 이해하기 위해선 ROWID에 대한 철저한 이해가 필요하다. 인덱스가 무엇이고 어떠한 역할을 아는지 알았으면, 이제는 더 근본으로 들어가서 내용을 파악할 필요성이 있다.


데이터베이스에서 데이터마다 주소를 의미하는 개념이 바로 ROWID이다. ROWID는 각각의 데이터를 구분할 수 있는 유일한 ID이기도 하다. 데이터마다 유일하기 때문에 오라클 내부에서는 데이터를 가리키기 위한 주소로 쓰인다.


ROWID 의 구조



  • 오브젝트 번호 
    - 해당 데이터가 속하는 오브젝트 번호이다. 오브젝트 별로 유일한 값을 가지고 있다.

  • 상대 파일 번호
    - 오라클의 테이블 스페이스는 여러 개의 DATAFILE을 생성할 수 있다. 오라클 8i 부터는 파일 번호가 10비트이기 때문에 테이블 스페이스당 1023개의 DATAFILE을 추가할 수 있다. 여기서 DATAFILE은 해당 테이블 스페이스의 상대 파일 번호를 의미하며, 각 데이터별로 유일한 값을 가지고 있다. 

  • 블록 번호
    - 파일 안에 어느 블록인지 의미한다.

  • 데이터 번호
    - 블록의 Header에서 해당 데이터의 위치 값을 저장하고 DATA Directory Slot을 가리킨다. 오브젝트 번호, 상대 파일 번호, 블록 번호가 같으면 데이터 번호는 블록 별로 데이터가 저장되어 순서를 의미한다. 

따라서 ROWID는 해당 데이터의 저장위치를 가리키는 요소라고 할 수 있다. 아래의 그림은 emp 테이블에서 ROWID를 추출한 SELECT 쿼리이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> SELECT ENAME, SAL, ROWID FROM emp;
 
ENAME                       SAL ROWID
-------------------- ---------- ------------------
SMITH                       800 AAAFJTAABAAAMF5AAA
ALLEN                      1600 AAAFJTAABAAAMF5AAB
WARD                       1250 AAAFJTAABAAAMF5AAC
JONES                      2975 AAAFJTAABAAAMF5AAD
MARTIN                     1250 AAAFJTAABAAAMF5AAE
BLAKE                      2850 AAAFJTAABAAAMF5AAF
CLARK                      2450 AAAFJTAABAAAMF5AAG
SCOTT                      3000 AAAFJTAABAAAMF5AAH
KING                       5000 AAAFJTAABAAAMF5AAI
TURNER                     1500 AAAFJTAABAAAMF5AAJ
ADAMS                      1100 AAAFJTAABAAAMF5AAK
 
ENAME                       SAL ROWID
-------------------- ---------- ------------------
JAMES                       950 AAAFJTAABAAAMF5AAL
FORD                       3000 AAAFJTAABAAAMF5AAM
MILLER                     1300 AAAFJTAABAAAMF5AAN
cs


그리고 사실 emp 테이블을 디스크립션 해보면 ROWID라는 컬럼이 존재하지 않지만 출력이 되는 것을 볼 수 있다. 


1
2
3
4
5
6
7
8
9
10
 Name                          Null?    Type
 ----------------------------- -------- --------------------
 EMPNO                         NOT NULL NUMBER(4)
 ENAME                                  VARCHAR2(10)
 JOB                                    VARCHAR2(9)
 MGR                                    NUMBER(4)
 HIREDATE                               DATE
 SAL                                    NUMBER(7,2)
 COMM                                   NUMBER(7,2)
 DEPTNO                                 NUMBER(2)
cs



그럼 앞서 추출된 ROWID의 18자리를 분석하자.


- ROWID의 처음 6자리, AAAFJTAABAAAMF5AAA

AAAFJT 는 오브젝트 번호이다. 이는 오브젝트 별로 유일한 값을 가지므로 EMP 테이블의 모든 데이터의 ROWID는 AAAFJT로 시작한다.


- ROWID의 7자리 ~ 9자리, AAAFJTAABAAAMF5AAA

EMP 테이블이 저장되어 있는 테이블 스페이스의 상대 파일 번호이다. EMP 테이블의 데이터일지라도 테이블의 익스텐트(EXTENT : 정도, 범위)가 다른 데이터 파일에 할당될 수 있다. 이 경우 해당 값은 서로 다르게 할당된다.


- ROWID의 10자리 ~ 15자리, AAAFJTAABAAAMF5AAA

블록 번호로 해당 데이터가 저장되어 있는 블록을 뜻한다. 


- ROWID의 16자리 ~ 18자리, AAAFJTAABAAAMF5AAA

오브젝트 번호, 파일 번호, 블록 번호가 동일하면 해당 데이터 번호는 해당 데이터의 저장 순서를 의미한다.




Posted by doubler
,