TECH
QUESTION
자주하는 질문답변 입니다.
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 | |||
---|---|---|---|
등록된 코멘트가 없습니다. |