해당 글은 전적으로 [ 꿈꾸는 개발자, DBA 커뮤니티 구루비 ] 에서 참고하였음을 밝힙니다. 개인 공부 및 기록을 위한 글입니다. 따라서 옮기는 과정에서 경어체는 모두 제거하였으며, 본인의 관점으로 글을 작성하였습니다. 상세하고 정돈된 내용은 하단에 참고링크를 보시길 바랍니다.
데이터베이스의 인덱스를 이해하기 위해선 ROWID에 대한 철저한 이해가 필요하다. 인덱스가 무엇이고 어떠한 역할을 아는지 알았으면, 이제는 더 근본으로 들어가서 내용을 파악할 필요성이 있다.
데이터베이스에서 데이터마다 주소를 의미하는 개념이 바로 ROWID이다. ROWID는 각각의 데이터를 구분할 수 있는 유일한 ID이기도 하다. 데이터마다 유일하기 때문에 오라클 내부에서는 데이터를 가리키기 위한 주소로 쓰인다.
ROWID 의 구조
오브젝트 번호
- 해당 데이터가 속하는 오브젝트 번호이다. 오브젝트 별로 유일한 값을 가지고 있다.상대 파일 번호
- 오라클의 테이블 스페이스는 여러 개의 DATAFILE을 생성할 수 있다. 오라클 8i 부터는 파일 번호가 10비트이기 때문에 테이블 스페이스당 1023개의 DATAFILE을 추가할 수 있다. 여기서 DATAFILE은 해당 테이블 스페이스의 상대 파일 번호를 의미하며, 각 데이터별로 유일한 값을 가지고 있다.블록 번호
- 파일 안에 어느 블록인지 의미한다.데이터 번호
- 블록의 Header에서 해당 데이터의 위치 값을 저장하고 DATA Directory Slot을 가리킨다. 오브젝트 번호, 상대 파일 번호, 블록 번호가 같으면 데이터 번호는 블록 별로 데이터가 저장되어 순서를 의미한다.
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
오브젝트 번호, 파일 번호, 블록 번호가 동일하면 해당 데이터 번호는 해당 데이터의 저장 순서를 의미한다.
'데이터베이스' 카테고리의 다른 글
20180226 Fetch Call (0) | 2018.02.26 |
---|---|
20180219 데이터베이스 인덱스(Index) : 비트맵 인덱스 (0) | 2018.02.19 |
20180218 데이터베이스 인덱스(Index) : 인덱스 기본 (0) | 2018.02.18 |
20180217 데이터베이스 인덱스(Index) : 인덱스, 무결성 (0) | 2018.02.17 |
20180209 오라클(Oracle)이란? (0) | 2018.02.09 |