이 기사에서는 Oracle에 대한 관련 지식을 제공하며, 주로 rowid에 대한 관련 문제를 소개합니다. Oracle 데이터베이스 테이블의 각 데이터 행에는 고유 식별자, 즉 rowid가 있는데, Oracle에서는 일반적으로 이를 내부적으로 데이터에 액세스하기 위해 사용합니다. 모두에게 도움이 될 것입니다.
추천 튜토리얼: "Oracle Learning Tutorial"
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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!