举例讲解Oracle表空间、段、区和块
Oracle逻辑存储结构分为空间、段、区、块四种。表空间、段、区和数据块分别表示了Oracle 进行数据存储的不同层次和结构。
本文首先讲解了对块、区、段、空间的理解,最后通过创建表空间h2,并在表空间h2上创建表regions,以及查询表空间、段、区,来进一步加深对表空间、段、区、块的认识。1、Oracle数据块(Oracle Data Block)
数据块Block是Oracle数据信息的最小逻辑存储单元。注意,这里说的是Oracle环境下的最小单位。Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异。无论是Windows 环境,还是Unix、Linux环境,其操作系统存储结构和方式、甚至字符排列的方式都是不同的。Oracle利用数据块将这些差异加以屏蔽,全部数据操作采用对Oracle块的操作,相当于是一个层次的抽象。
Oracle所有对数据的操作和空间分配,实际上都是针对数据块Block的操作。我们从数据表中搜索出一行,实际中Oracle就会从内存缓冲区(或者硬盘)中读取到该行所在的数据块,再返回这数据块上的指定数据行。Oracle无论是在缓冲区,还是在硬盘,进行数据操作的最小单位都是数据块。
数据块是有大小的,在一个数据库建立的时候,通过参数进行设置。注意,在Oracle数据库参数中,只有数据块大小的参数是建库之后不能进行修改的。数据块的大小,在一个数据库中可以支持多个。
数据块的大小是通过kb字节个数来指定的,默认为8KB。相关参数为db_block_size,下面是查看block大小的语句。
SQL> show parameter db_block_size;
NAME TYPE VALUE
------------------------------------ ----------- -------------------
db_block_size integer 8192
设置数据块的大小是依据不同类型的系统的。如果数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引发的换入换出可能较多。如果设置的过小,频繁的IO逻辑物理读也会引起性能问题。
与数据块有关系的另一个参数就是db_file_multiblock_read_count,表示一次从物理存储中读取的数据块数量。对一些数据挖掘系统,可以考虑调节此参数略大一些。
2、比block更高的一个单位,区extent。
区extent,是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。我们知道,物理存储通常是随机的读写过程。即使在同一个文件里,我们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储同样如此。
在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表示一系列连续的数据块集合。
视图dba_extents(或者all_extents、user_extents)是我们研究区结构的重要手段。
SQL>descdba_extents;
名称类型是否为空
---------------------------- ---------------------- --------------
OWNER VARCHAR2(30)
SEGMENT_NAME VARCHAR2(81)
PARTITION_NAME VARCHAR2(30)
SEGMENT_TYPE VARCHAR2(18)
TABLESPACE_NAME VARCHAR2(30)