数据库的物理存储结构

select * from v$datafile;

数据库的逻辑存储结构,从表空间开始查起
一个数据库对象的逻辑存储结构如下
表空间-段-区-块

select * from dba_tablespaces;
select * from dba_segments
where tablespace_name='KYC_VEH';
select * from dba_segments
where tablespace_name='KYC_VEH' and segment_name='VEHICLE_INFO';
select * from dba_extents
where tablespace_name='KYC_VEH' and segment_name='VEHICLE_INFO';

初始是按照一个区8个块进行分配的,也即65536B,initial_extent是65536,即dba_segments中的initial_extent字段值
select 16*8*8192 from dual;
1048576
初始大小占完之后,再分配时是按照一个区128个块进行分配的,也即1MB,next_extent是1048576,即dba_segments中的next_extent字段值
select 128*8192 from dual;
1048576

一个段占用了17 extents
一个区8个块,即一个区是65536字节
一个块8192字节

block_id是全局的,其它的是相对的
select * from dba_segments;
主要关注header_block,blocks两个字段的值变化,并且可以降序或升序看一下

==============================

dba_extents 中除了记录每个extent启始块号(block_id),还记录了该extent中有多少个块(blocks)。所以,只要查到11943在哪个范围内就可以知道这个块属于哪个extent,属于哪个段了。但是,每个数据文件中的块号都是从头开始编号的,意味着每个数据文件都可能会有11943这个块号。所以,你还需要知道这个块属于哪个文件。

另一种方法:DUMP出该数据块的任一行记录的ROWID,通过ROWD可以直接计算出对应的唯一文件号和对象号,从而知道该块存在哪了个数据文件上,是属于哪个对象的。
select  dbms_rowid.rowid_object(rowid) objectid--对象号
       ,dbms_rowid.rowid_relative_fno(rowid) fileid--文件号
       ,dbms_rowid.rowid_block_number(rowid) blockid--块号
       ,dbms_rowid.rowid_row_number(rowid) rownums--行号
from dual

04-23 02:28