您好,欢迎访问一九零五行业门户网

简单分析Oracle的数据存储

在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据
在数据库的存储结构中,我们知道一般来说一个表都存储在对应的数据文件里,数据文件可以分为多个段,一般来说一个表会对应一个数据段,单纯考虑数据段的时候,,数据段又可以分为多个区,每个区都可以分为若干个数据块,在操作系统层面,有对应的数据块和数据库层面的数据块有一个映射,可以打个比方来说,一栋大楼里面可以有很多的楼层,每个楼层可能都有不同的公司,这样来考虑,这栋大楼就类似数据文件,楼的每一层就类似一个数据段,每一层比方最多可以有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
那么这些数据类型的数据占用的空间是否是按照最大字节208来存储的呢,换句话说就是表里存放着一条记录,可能长度只有number(2),但是是否会依旧占用22个字节来存储呢。
 我们随机抽取一个数据块来简单的测试一下。
 可以看到如下两条记录是从0开始计数的,都在12803这个数据块中。
select dbms_rowid.rowid_object(rowid) object_id,
 dbms_rowid.rowid_relative_fno(rowid) file_no,
 dbms_rowid.rowid_row_number(rowid) row_no,
 dbms_rowid.rowid_block_number(rowid) blk_number
 from data  where rownum      object_id    file_no    row_no blk_number
 ---------- ---------- ---------- ----------
      18993        11          0      12803
      18993        11          1      12803
我们来进一步查看12803这个数据块中含有哪些记录。不考虑数据块的其他存储参数。按照默认的值来看。
 里面含有约148条记录。
其它类似信息

推荐信息