>  기사  >  데이터 베이스  >  Oracle Study Guide의 rowid에 대한 자세한 설명

Oracle Study Guide의 rowid에 대한 자세한 설명

WBOY
WBOY앞으로
2022-03-15 18:03:143347검색

이 기사에서는 Oracle에 대한 관련 지식을 제공하며, 주로 rowid에 대한 관련 문제를 소개합니다. Oracle 데이터베이스 테이블의 각 데이터 행에는 고유 식별자, 즉 rowid가 있는데, Oracle에서는 일반적으로 이를 내부적으로 데이터에 액세스하기 위해 사용합니다. 모두에게 도움이 될 것입니다.

Oracle Study Guide의 rowid에 대한 자세한 설명

추천 튜토리얼: "Oracle Learning Tutorial"

1. rowid에 저장된 정보 개요

oracle 데이터베이스 테이블의 각 데이터 행에는 oracle의 고유 식별자인 rowid가 있습니다. 일반적으로 데이터에 액세스하기 위해 내부적으로 사용됩니다. rowid는 10바이트의 저장 공간이 필요하며 표시하는 데 18자를 사용합니다. 이 값은 Oracle 데이터베이스에 있는 행의 특정 물리적 위치를 나타냅니다. Rowid는 쿼리 결과에 값이 포함되어 있음을 나타내기 위해 쿼리에 사용될 수 있습니다.

                                      rowid를 저장하려면 10바이트 또는 80바이너리 비트가 필요합니다. 확장된 rowid는 obj#32bit, rfile#10bit, block#22bit 및 row#16bit를 포함하여 총 80비트로 10바이트에 저장됩니다. 따라서 상대 파일 번호는 1023을 초과할 수 없습니다. 즉, 테이블스페이스의 데이터 파일 수는 1023을 초과할 수 없습니다(파일 번호가 0인 파일은 없습니다). 데이터 파일은 2^22=4M 블록만 가질 수 있습니다. 1023개 이상의 블록이 하나의 블록에 포함될 수 있습니다. 2^16=64K 행의 데이터입니다. 데이터베이스에는 2^32=4G 객체를 초과할 수 없습니다.
이 80개의 이진 비트는 다음과 같습니다.
1. 이 행이 속한 데이터베이스 개체의 번호를 나타내는 데이터 개체 번호. 각 데이터 개체에는 데이터베이스가 생성될 때 고유하게 할당되는 번호가 있으며 이 번호는 고유합니다. 데이터 개체 번호는 약 32비트를 차지합니다.
2. 행이 위치한 파일 번호를 나타내는 해당 파일 번호. 테이블스페이스의 각 파일 레이블은 고유합니다. 파일 번호는 10자리를 차지합니다.
3. 라인이 리디렉션되는 파일의 블록 위치를 나타내는 블록 번호. 블록 번호에는 22자리가 필요합니다.
4. 행 디렉토리에서 행의 특정 위치를 나타내는 행 번호. 행 번호에는 16자리가 필요합니다.
이 숫자를 더하면 최대 80자리가 됩니다.

참고: Oracle 버전 8 이전의 rowid는 6바이트의 공간을 차지하는 file# block# row#, 10비트 file#, 22bit block# 및 16비트 row#로 구성되었습니다. Oracle8 이상 버전에서는 공간을 10바이트로 변경합니다.

오라클의 물리적 확장 ROWID는 18비트로 구성되며, 각 비트는 64비트로 인코딩되며, A~Z, a~z, 0~9, +, /로 표시되며 총 64자입니다. A는 0, B는 1, ... Z는 25, a는 26, ... z는 51, 0은 52, ..., 9는 61, +는 62, /는 63을 나타냅니다.

SELECT T.ROWID, T.* FROM DEPT T

rowid의 저장 공간이 32bit object#, 10bit rfile#, 22bit block#, 16bit row#을 포함하여 10byte인지 확인합니다. 덤프 기능을 사용해야 합니다.

select rowid,dump(rowid,16) from DEPT

2. rowid 내용 확인 및 보기

1. dbms_rowid 패키지의 함수를 사용하여

SELECT ROWID,
       DBMS_ROWID.ROWID_OBJECT(ROWID) AS OBJECT,
       DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) AS FILENUM,
       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) AS BLOCK,
       DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) AS ROWN
  FROM DEPT;

결과를 확인합니다.

2. 테이블에서 데이터 정보를 쿼리합니다

1). 쿼리 개체 번호: DATA_OBJECT_ID

SELECT OBJECT_NAME, OBJECT_TYPE, SUBOBJECT_NAME, OBJECT_ID, DATA_OBJECT_ID
  FROM DBA_OBJECTS T
 WHERE T.OBJECT_NAME ='DEPT'
 AND T.OWNER = 'CHF';

결과는 다음과 같습니다.

설명: DATA_OBJECT_ID와 OBJECT_ID의 차이점

object_id와 data_object_id는 모두 개체의 고유 식별자입니다.

object_id는 객체의 논리적 식별입니다.

data_object_id는 객체의 물리적 식별입니다.

테이블, 인덱스, 실행 취소 등 실제 물리적 저장 위치가 있는 객체만 data_object_id를 갖습니다. 물리적 저장소가 없는 객체의 경우 data_object_id가 비어 있습니다. 예: (프로시저, 함수, 패키지, 데이터 유형, db 링크, mv 정의, 뷰 정의, 임시 테이블, 파티션 테이블 정의 등)

대부분의 경우 둘은 동일합니다. 그러나 객체에 대해 자르기, 이동, 재구축 및 기타 작업이 수행된 후에는 data_object_id가 변경되지만 object_id는 변경되지 않습니다.

대상 DEPT에서 자르기 작업을 실행합니다. 코드: TRUNCATE TABLE DEPT;

결과를 다시 쿼리합니다.

테이블에 자르기 전에 데이터를 다시 삽입하고 객체 번호를 나타내는 rowid 부분을 확인합니다. AAAUOO에서 AAAUOP로 변경되었으며 1이 증가했습니다.

2) 쿼리 파일 번호:

SELECT T.SEGMENT_NAME, T.HEADER_BLOCK, T.BLOCKS, T.EXTENTS, T.RELATIVE_FNO
  FROM DBA_SEGMENTS T
 WHERE T.SEGMENT_NAME = 'DEPT'
   AND T.OWNER = 'CHF';

HEADER_BLOCK: 이 테이블의 첫 번째 데이터 블록 번호

BLOCKS: 이 테이블의 데이터 블록 개수

RELATIVE_FNO: 상대 파일 번호

결과는 다음과 같습니다. :

说明:

从Oracle8开始,Oracle开始使用“相对文件号”,使原来一个数据库最多只能有1023个文件,扩展为一个表空间最多可以有1023个文件,每个库最多可以有65534个文件

验证文件号

SELECT T.TABLE_NAME,
       T.TABLESPACE_NAME,
       G.FILE_NAME,
       G.FILE_ID,
       G.RELATIVE_FNO
  FROM DBA_TABLES T
 INNER JOIN DBA_DATA_FILES G
    ON G.TABLESPACE_NAME = T.TABLESPACE_NAME
 WHERE T.TABLE_NAME = 'DEPT'
 AND T.OWNER = 'CHF';

执行结果:

因为创建用户时没用指定默认表空间,建表时也没用指定表空间,所以此处使用的USERS表空间(大家不必在意这些细节...),可以看到文件号和相对文件号都是 4 ,这是因为我的数据库中每个表空间只有一个数据文件,如果一个表空间有多个数据文件,这两个值有可能不一样。

知识扩展:

我们可以使用跟踪文件查看数据文件信息,命令:alter session set events 'immediate trace name FILE_HDRS level 10';

执行完此代码后,将在数据库服务器生成一个跟踪文件,查看文件路径代码:

select
  u_dump.value || '/' ||
  db_name.value || '_ora_' ||
  v$process.spid ||
  nvl2(v$process.traceid, '_' || v$process.traceid, null )
  || '.trc' "Trace File"
from
v$parameter u_dump
cross join v$parameter db_name
cross join v$process
join v$session
on v$process.addr = v$session.paddr
where
  u_dump.name = 'user_dump_dest' and
  db_name.name = 'db_name' and
  v$session.audsid=sys_context('userenv','sessionid');

推荐教程:《Oracle教程

위 내용은 Oracle Study Guide의 rowid에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제