Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 (V8.X) ROWID에 대한 이해
V8.X) ROWID에 대한 이해
===========================

Oracle8.x(이하 8.x) 의 rowid는 Oracle7.x(이하 7.x) 의 그것과는 포함되는
정보, 표현 형식이 달라졌다. 여기서는 8.x 의 rowid에 대한 일반적인 내용을
살펴본다.

<기본 format>

7.x의 경우 : 'BBBBBBBB.RRRR.FFFF'
BBBBBBBB - row가 위치한 file 내에서의 block id
RRRR - block 내에서의 row의 sequence number
FFFF - row가 위치한 file id

* 7.x의 rowid에 대해서는
bulletin:10308 '(V7.X) ROWID에 대한 이해' 참조

8.x의 경우 : 'OOOOOOFFFBBBBBBSSS'
OOOOOO - row가 위치한 segment의 data object number
FFF - row가 위치한 datafile의 relative datafile number
BBBBBB - file내에서의 block id
SSS - block 내에서의 row의 sequence number

rowid의 각 구성요소들은 64진법을 이용하여 표현된다. (A-Z,a-z,0-9,+,/)
이에 따르면 'A'는 0을, 'a'는 26을, '0'은 52를, '+'는 62를, '/'는 63을
표현하게 된다.
이들 각 구성요소를 10진수로 변환하기 위해서 직접 계산을 해도 되겠으나,
bulletin:11366 '(V8.X) DBMS_ROWID PACKAGE 사용 방법' 을 참고하면
쉽게 확인할 수 있다.

<각 구성요소의 의미>

OOOOOO : data object number 로써 물리적인 segment의 id를 의미한다.

그 구체적인 의미를 다음의 두가지 경우를 가지고 살펴본다.

1. 동일한 cluster를 구성하는 table들은 object_id는 상이하지만,
물리적으로 같은 segment내에 함께 존재하므로 data_object_id
(data object number)는 동일하다.

예> CREATE CLUSTER clu_test (clu_key NUMBER(3)) ;
CREATE TABLE tab1 (a NUMBER(3)) CLUSTER clu_test (a) ;
CREATE TABLE tab2 (b NUMBER(3)) CLUSTER clu_test (b) ;

SQL> SELECT object_name,object_id,data_object_id
2 FROM user_objects ;

OBJECT_NAM OBJECT_ID DATA_OBJECT_ID
---------- ---------- --------------
TAB1 8916 8915
TAB2 8917 8915
CLU_TEST 8915 8915

2. partitioned table에 속한 partition을 move 하면 해당 partition의
object_id 는 이전과 동일하지만 data_object_id(data object number)
는 변경된다.

* partition table에 대한 기본 개념은
bulletin:11269 'PARTITION TABLE 이란?' 을 참조한다.

예> CREATE TABLE emp (EMPNO NUMBER(5))
PARTITION BY RANGE(EMPNO)
(PARTITION emp_p1 VALUES LESS THAN (2000),
PARTITION emp_p2 VALUES LESS THAN (4000),
PARTITION emp_p3 VALUES LESS THAN (MAXVALUE));

SQL> SELECT object_name, subobject_name, object_id,
2 data_object_id
3 FROM user_objects ;

OBJECT_NAM SUBOBJECT_ OBJECT_ID DATA_OBJECT_ID
---------- ---------- ---------- --------------
EMP EMP_P1 8912 8912
EMP EMP_P2 8913 8913
EMP EMP_P3 8914 8914
EMP 8911

SQL> ALTER TABLE emp
2 MOVE PARTITION emp_p1 TABLESPACE wookpark ;

Table altered.

SQL> SELECT object_name, subobject_name, object_id,
2 data_object_id
3 FROM user_objects ;

OBJECT_NAM SUBOBJECT_ OBJECT_ID DATA_OBJECT_ID
---------- ---------- ---------- --------------
EMP EMP_P1 8912 8923
EMP EMP_P2 8913 8913
EMP EMP_P3 8914 8914
EMP 8911

FFF : relative datafile number (the first file is 1)
7.x 의 absolute datafile number 는 전체 database 안에서 고유하지만,
8.x 의 relative datafile number는 특정 tablespace 내에서만
고유하다. 따라서 서로다른 두개의 tablespace에 속한 datafile들이
동일한 relative datafile number를 가질 수 있다.
8.x 의 dba_data_files 의 file_id 는 absolute file number 를,
relative_fno 는 relative file number 를 의미함.

7.x 에서는 최대 1022개의 datafile을 사용할 수 있었음.
8.x 에서는 tablespace당 최대 1023개의 datafile을 사용할 수 있음.
이로 인해 VLDB 를 지원할 수 있음.

전체 database 의 datafile 갯수가 1023개를 넘기 전까지는 file_id와
relative_fno 는 동일한 값을 갖는다.

SQL> SELECT file_name, file_id, tablespace_name, relative_fno
2 FROM dba_data_files
3 ORDER BY tablespace_name, relative_fno ;

FILE_NAME FILE_ID TABLESPACE_N RELATIVE_FNO
------------------------------ ------ ------------ ------------
/home/disk2/data/system01.dbf 1 SYSTEM 1
/home/disk2/data/system02.dbf 2 SYSTEM 2
/home/disk2/data/system03.dbf 3 SYSTEM 3
/home/disk2/data/user01.dbf 4 WOOKPARK 4
/home/disk2/data/user02.dbf 5 WOOKPARK 5

BBBBBB : 해당 row가 위치한 block id

SSS : block 내에서의 해당 row의 sequence number
Comment
등록된 코멘트가 없습니다.