在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,数据段又可以分为多个区,每个区都可以分为若干个数据块,在操作系统层面,有对应的数据块和数据库层面的数据块有一个映射,可以打个比方来说,一栋大楼里面可以有很多的楼层,每个楼层可能都有不同的公司,这样来考虑,这栋大楼就类似数据文件,楼的每一层就类似一个数据段,每一层比方最多可以有4家公司,一家公司有40个人,有的公司大一点,占用两层,那么就是8个区,320个数据块,有的公司小一点,就占用一层里面的一块,那么这个公司就类似一个较小的数据段,占用1个区,包含40个数据块。
从存储层面来说,目前数据库中只能够查询到区这一级别的信息了。
在user_extents中只能够查看到最基本的区的信息,user_segment里面可以得到一个大体的信息
SQL> desc user_extents
Name Null? Type
----------------------------------------- -------- ----------------------------
SEGMENT_NAME VARCHAR2(81)
PARTITION_NAME VARCHAR2(30)
SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)
EXTENT_ID NUMBER
BYTES NUMBER
BLOCKS NUMBER
SQL> select extent_id,blocks from user_extents where segment_name='DATA';
EXTENT_ID BLOCKS
---------- ----------
0 8
1 8
2 8
3 8
4 8
5 8
SQL> select extents,blocks from user_segments where segment_name='DATA';
EXTENTS BLOCKS
---------- ----------
6 48
如果想查看每个区中包含哪些数据块,就无能为力了。这个时候dba_extents可以作为一个补充。可以看到哪些区包含哪些数据块。
SQL> select block_id,extent_id,BLOCKS from dba_extents where owner='N1' and segment_name='DATA';
BLOCK_ID EXTENT_ID BLOCKS
---------- ---------- ----------
12800 0 8
12808 5 8
3600 4 8
5224 3 8
12672 2 8
12672 1 8
当然了这个也不能让热满意,有时候想看看一些记录大概占有多大的空间,就可以使用rowid来辅助了。
目前我们得到表data的数据类型如下:
DATA_LENGTH DATA_TYPE
----------- ------------------------------
10 VARCHAR2
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
22 NUMBER
SQL> select sum(data_length) from user_tab_cols where table_name='DATA';
SUM(DATA_LENGTH)
----------------
208