在Oracle学习过程当中,存储结构,表段区块多是每一个初学者都要涉及到的概念。表空间、段、分区和数据块分别表示了Oracle进行数据存储的不一样层次和结构。了解清楚这几个结构,有助于咱们奠基一个稳固的学习基础,并且对于理解Oracle工做原理也有重要做用。 数据库
本文采用从小到大,逐步拓展的方式介绍四个结构,而且与Schema、数据文件的区别进行对比。 oracle
数据块(Block) 负载均衡
数据块Block是Oracle存储数据信息的最小单位。注意,这里说的是Oracle环境下的最小单位。Oracle也就是经过数据块来屏蔽不一样操做系统存储结构的差别。不管是Windows环境,仍是Unix/Linux环境,他们的操做系统存储结构和方式、甚至字符排列的方式都是不一样的。Oracle利用数据块将这些差别加以屏蔽,所有数据操做采用对Oracle块的操做,至关因而一个层次的抽象。 性能
Oracle全部对数据的操做和空间分配,实际上都是针对数据块Block的操做。咱们从数据表中搜索出一行,实际中Oracle就会从内存缓冲区(或者硬盘)中读取到该行所在的数据块,再返回这数据块上的指定数据行。Oracle不管是在缓冲区,仍是在硬盘,进行数据操做的虽小单位也就是数据块。 学习
数据块是有大小的,在一个数据库创建的时候,经过参数进行设置。注意,在Oracle数据库参数中,只有数据块大小的参数是建库以后不能进行修改的。数据块的大小,在一个数据库中能够支持多个,可是通常没有太大的意义,会给管理和调试带来必定的负担。 this
数据块的大小是经过kb字节个数来指定的,默认为8KB。相关参数为db_block_size,下面是查看block大小的语句。 spa
SQL> show parameter db_block_size; 操作系统
NAME TYPE VALUE 调试
------------------------------------ ----------- ------------------------------ 对象
db_block_size integer 8192 //1024×8
设置数据块的大小是依据不一样类型的系统的。若是数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引起的换入换出可能较多。若是设置的太小,频繁的IO逻辑物理读也会引发性能问题。
与数据块有关系的另外一个参数就是db_file_multiblock_read_count,表示一次从物理存储中读取的数据块数量。对一些数据挖掘系统,能够考虑调节此参数略大一些。
接下来,咱们看比block更高的一个单位,区extent。
区extent
区extent是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。咱们知道,物理存储一般是随机的读写过程。即便在同一个文件里,咱们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储一样如此。
在进行存储数据信息的时候,Oracle将分配数据块进行存储,可是不能保证全部分配的数据块都是连续的结构。因此,出现分区extent的概念,表示一系列连续的数据块集合。
视图dba_extents(或者all_extents、user_extents)是咱们研究分区结构和存储构成的重要手段。
SQL> desc dba_extents;
Name Type Nullable Default Comments
--------------- ------------ -------- ------- ---------------------------------------------------------
OWNER VARCHAR2(30) Y Owner of the segment associated with the extent
SEGMENT_NAME VARCHAR2(81) Y Name of the segment associated with the extent
PARTITION_NAME VARCHAR2(30) Y Partition/Subpartition Name, if any, of the segment
SEGMENT_TYPE VARCHAR2(18) Y Type of the segment
TABLESPACE_NAME VARCHAR2(30) Y Name of the tablespace containing the extent
EXTENT_ID NUMBER Y Extent number in the segment
FILE_ID NUMBER Y Name of the file containing the extent
BLOCK_ID NUMBER Y Starting block number of the extent
BYTES NUMBER Y Size of the extent in bytes
BLOCKS NUMBER Y Size of the extent in ORACLE blocks
RELATIVE_FNO NUMBER Y Relative number of the file containing the segment header
从视图中,咱们能够清晰看出分区的几个特色。
首先分区是带有段特定性的。数据段segment是分区的上层组织单位,一个数据库对象对应一个segement,数据库对象是归属在不一样的schema(owner)上的。因此,经过不一样的数据段名称、不一样的owner,乃至不一样的tablespace表空间信息,就能够定位到数据区extent的信息描述。
另外一部分信息是关于该区extent的分配信息,如所在文件编号,起始数据块block编号和数据块数量等内容。
数据段segment
数据段是与数据库对象相对应,通常一个数据库对象对应一个数据段。多个extent是对应一个数据段,每一个数据段实际上就是数据库一个对象的表明。从dba_segments视图中,能够比较清楚看清数据段的结构。
SQL> desc dba_segments;
Name Type Nullable Default Comments
--------------- ------------ -------- -------
OWNER VARCHAR2(30) Y Username of the segment owner
SEGMENT_NAME VARCHAR2(81) Y Name, if any, of the segment
PARTITION_NAME VARCHAR2(30) Y Partition/Subpartition Name, if any, of the segment
SEGMENT_TYPE VARCHAR2(18) Y Type of segment: "TABLE", "CLUSTER", "INDEX", "ROLLBACK",
"DEFERRED ROLLBACK", "TEMPORARY","SPACE HEADER", "TYPE2 UNDO" or "CACHE"
TABLESPACE_NAME VARCHAR2(30) Y Name of the tablespace containing the segment
HEADER_FILE NUMBER Y ID of the file containing the segment header
HEADER_BLOCK NUMBER Y ID of the block containing the segment header
BYTES NUMBER Y Size, in bytes, of the segment
BLOCKS NUMBER Y Size, in Oracle blocks, of the segment
EXTENTS NUMBER Y Number of extents allocated to the segment
INITIAL_EXTENT NUMBER Y Size, in bytes, of the initial extent of the segment
NEXT_EXTENT NUMBER Y Size, in bytes, of the next extent to be allocated to the segment
MIN_EXTENTS NUMBER Y Minimum number of extents allowed in the segment
MAX_EXTENTS NUMBER Y Maximum number of extents allowed in the segment
PCT_INCREASE NUMBER Y Percent by which to increase the size of the next extent to be allocated
FREELISTS NUMBER Y Number of process freelists allocated in this segment
FREELIST_GROUPS NUMBER Y Number of freelist groups allocated in this segment
RELATIVE_FNO NUMBER Y Relative number of the file containing the segment header
BUFFER_POOL VARCHAR2(7) Y The default buffer pool to be used for segments blocks
从segment_type列的comment信息中,能够看出数据段的类型是多样的。任何种类的数据库对象,本质上都是一种数据段。数据表、索引、回滚、汇集这些都是数据段的一种表现形式。同时,数据段是在数据对象建立的时候就已经建立出来,随着对象体积的增大,而不断分配多个extents进行管理。
另外一部分信息能够从dba_segments中读出的,就是该数据对象分配的空间大小和数据块、分区个数。使用这个视图,能够方便的获取到指定schema的全部对象大小。
SQL> select owner,sum(bytes)/1024/1024 as vol, sum(blocks) as totalblocks,sum(extents) as totalextents from dba_segments group by owner having wner='SYS';
OWNER VOL TOTALBLOCKS TOTALEXTENTS
------------------------------ ---------- ----------- ------------
SYS 585.5 74944 3248
上面查询,说明SYS的schema,所占用空间585.5MB,包括74944个数据块和3248个分区。
一个对象建立出来以后,在segment层次上是分配一个分区extent和八个数据块block。
有一个问题须要注意,一般咱们的数据段是与数据对象相关。一个数据对象对应一个segment。可是,分区表的时候,一个分区要对应一个segment对象。还有就是,segment对象是能够指定存储在那个表空间里,实现存储划分的基础也就在于此。不一样类型的segment划分创建在不一样的表空间里,才有可能存放在不一样的文件中,最后分布在不一样的物理存储。
分区实际上就是存在分开存储的可能。通常一个对象是不会跨物理存储进行存放的,分区表是对应的多个segment。因此,分区表分开存储空间是可能的。
表空间tablespace
TableSpace是存储结构中的最高层结构。创建一个表空间的时候,是须要指定存储的文件。一个表空间能够指定多个数据文件,多个文件能够在不一样的物理存储上。也就是说,表空间是能够跨物理存储的。可是有一点就是,表空间下一级对象数据段的存储,是不能指定存储在那个文件里的。因此,要想让数据对象访问IO负载均衡,须要指定不一样的数据对象在不一样的表空间里。这也就是为何将数据表和索引创建在不一样的表空间的缘由。
表空间经过v$tablespace进行访问。
SQL> desc v$tablespace;
Name Type Nullable Default Comments
--------------------------- ------------ -------- ------- --------
TS# NUMBER Y
NAME VARCHAR2(30) Y
INCLUDED_IN_DATABASE_BACKUP VARCHAR2(3) Y
BIGFILE VARCHAR2(3) Y
FLASHBACK_ON VARCHAR2(3) Y
ENCRYPT_IN_BACKUP VARCHAR2(3) Y
相对于前面的结构视图,表空间视图的结构要简单的多,只是一些描述信息。其中两个参数须要注意一下。
一个是bigfile,是一个标志位,标志表空间是否是所谓的大文件表空间。大文件表空间是在10g中推出的一个新特性,处于性能考虑,能够设置表空间为大文件表空间,存储超过百T的数据,可是要求数据文件只能有一个。另外一个是flashback_on,表示表空间的闪回特性是否开启。
要注意,数据表段区块的概念集合,很容易与schema的结构相混淆。schema是一个组织概念,是来自于经典数据库理论范畴。在oracle中,Schema就是一个组织概念,一个user对应的就是一个schema。schema是逻辑对象的集合组织,同表空间等概念不是一个层面的。
在一个schema里,是能够将对象创建在任何数据表空间内的,只有一个默认表空间的概念default tablespace。指定默认表空间是在建立用户的时候指定的。
分清几个核心概念和各自的区别关系,就能更好的理解Oracle运行的各类机制。