oracle数据文件存储的几个概念

概念:

block,块,有2KB,4KB,8KB(常用),是oracle空间分配的最小单位。构成:块头+表目录+行目录+空闲空间+数据空间

extent,区,由连续的block组成,大小从1个块到2GB不等。

segment,段,是数据库对象的磁盘分配单位,表-表段,索引-索引段。

tablespace,表空间,是一个逻辑容器,与一个数据文件关联,一个tablespace最少对应一个数据文件,可以有多个段,但一个段只能属于一个表空间。

schema,模式,可以理解为与用户对应的逻辑对象。当多个用户共享一个表空间时,用schema进行逻辑区分。

闲聊几句:

1.数据库文件归根到底也是磁盘文件,它之所以访问速度快,是因为采用了比普通操作系统磁盘管理效率更高的组织和访问方式。比如块,多条连续的数据存在一个块上,这样访问的时候,可以一次读出相关的数据,IO效率就比较高。多个连续的块组成区,也是这个道理。因为无论oracle还是操作系统,当你发出一个读取文件的指令的时候,它们都会一次读出目标数据和周围的相关数据进行缓存,这样就大大降低IO次数,从而加快访问速度。不过,随着对表数据的修改和插入,可能会产生磁盘碎片,比如delete的数据并不会释放空闲块,新插入的数据会不断提高HWM,在进行查询时,oracle还是会扫描那些空的数据块。因此定期对表进行重建,或者使用move命令进行数据重组,是保证数据库访问效率的必要操作。

2.块的大小默认8K,根据一条数据的字段数量和字段长度,可以计算出一个块可以存储多少数据。mysql中会建议用户最好减少使用varchar类型,虽然这种类型对开发者来说比较省事,但是却会提高数据存储的复杂度。oracle中则恰恰相反,oracle提倡使用varchar2类型,oracle认为这种情况下如果一个字段定义2000的长度,实际存储为1的话,它就只占用1字节的位置不会造成空间的浪费,我觉得这可能与oracle在块中分配有空闲区域有关,空闲区域的存在,使得oracle在处理变长字段时有额外操作空间。oracle在对变长的字段进行更新操作时,如果字段内容较大,会导致原来在一个块中的数据,不得不扩展占用两个块,就是俗称的行迁移。而且在更新操作时,如果预留空间不足,可能会增加数据移动的IO操作。oracle中的clob和blob对象比较特殊,在字段位置存储的是一个引用,真正的数据在另外开辟的一块地方;如果一条数据一个8K的块都放不下,至少占用2个块,这样一条数据链接多个块的情况,称为行链接。这种情况下,可以增大默认块大小,尽量让一条数据存在于一个块上。

你可能感兴趣的:(oracle,oracle,文件存储)