ORACLE的逻辑存储管理
Oracle在逻辑存储上分4个粒度:表空间Tablespace、段Segment、盘区学小提琴Extent、块Block。
Oracle数据库在逻辑上是由多个表间组成的,表空间中存储的对象叫段,段由区组成,区是磁盘分配的最小单位。
每个区的大小是数据块大小的整数倍,区的大小可以不相同。
数据块是数据库中最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。
一、数据库由一个或多个表空间组成;
二、表空间由一个或多个数据文件组成,一个表空间包含多个段;
三、段由一个或多个区组成(Oracle的分区表可以包括多个分区,每个分区都是一个独立的段);一个段对应唯一的表空间。
四、区是数据文件中一个连续的分配空间,由一个或多个块组成;
五、块是数据库中最小、最基本的单位,是数据库使用的最小的I/O单元。
一、块(Block)
数据块Block是Oracle存储数据信息的最小单位。
Oracle就是通过数据块来屏蔽不同操作系统存储结构的差异。无论是Windows环境,还是Unix/Linux大中国歌词下载环境,他们的操作系统存储结构和方式、甚至字符排列的方式都是不同的。Oracle利用数据块将这些差异加以屏蔽,全部数据操作采用对Block的操作,相当于是一个层次的抽象。
Oracle所有对数据的操作和空间分配,实际上都是针对数据块梦见抱着小孩Block的操作。我们从数据表中搜索出一行,实际中Oracle就会从内存缓冲区(或者硬盘)中读取到该行所在的数据块,再返回该数据块上的指定数据行。
数据块是有大小的,在一个数据库建立的时候,通过参数进行设置。(注意:Oracle数据库参数中,数据块大小的参数db_block_size是建库之后不能进行修改的)。
数据库中每个块的大小都是相同的,而且所有的块都有相同的格式,由“块头+表目录+行目录+空闲空间+数据空间”组成。块头包含着块类型(比如是表块、还是索引块)的信息、磁盘上块的位置等信息。表目录(table directory),如果有的话,包含着此块中存储各行的表的信息(如果一个块中存有多个表中的数据)。行目录(row directory)包含着数据行的描述信息,它是一个指针数组,指示了每一行在数据块中的物理位置。块头、表目录、行目录统称为块开销(block overhead),是oracle原来统计、管理块本身的。剩下的两部分很简单,已经存有数据的就是数据空间,暂时没存的就是空闲空间。
数据块的大小是通过KB字节个数来指定的,默认为8KB。相关参数为db_block_size。
查看参数设置:show parameter db_block_size;
设置数据块的大小是依据不同类型的系统的。如果数据块设置比较大,那么一次读取的数据行较多,相应对SGA内存消耗比较大,特定查询引发的换入换出可能较多。如果设置的过小,频繁的IO逻辑物理读也会引起性能问题。与数据块有关系的另一个参数就是db_file_multiblock_read_count。表示一次从物理存储中读取的数据块数量。对一些数据挖掘系统,可以考虑调节此参数略大一些。
查看参数设置:show parameter db_file_multiblock_read_count;
二、区(Extent)
区Extent是比数据块大一级的存储结构,表示的是一连串连续的数据块集合。我们知道,物理存储通常是随机的读写过程,即使在同一个文件里,我们也不能保证相同的一个信息是存储在绝对连续的物理存储空间的。Oracle数据存储同样如此。
在进行存储数据信息的时候,Oracle将分配数据块进行存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区Extent的概念,表示一系列连续的数据块集合。
区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。
视图Dba_Extents(或者All_Extents、User_Extents)是我们研究区结构的重要手段。
从视图结构中,我们可以清晰看出区的几个特点。
首先,分区是带有段特定性的。数据段Segment是区的上层组织单位,一个数据库对象对应一个Segment,数据库对象是归属在不同的Schema(Owner)上的。所以,通过不同
的数据段名称、不同的Owner,乃至不同的Tablespace表空间信息,就可以定位到数据区Extent的信息描述。 其次,另一部分信息是关于该区Extent的分配信息,如所在文件编号,起始数据块Block编号和数据块数量等内容。
三、段(Segment)
段是oracle数据库中的分配单位,对象如表、索引等都是以段为单位进行分配。当创建一个表时将创建一个表段,创建一个索引时就创建一个索引段。每一个消耗存储空间的对象最终被存储到一个单一的段中。
多个Extent区构成一个数据段,每个数据段实际上就是数据库一个对象的代表。
从dba_Segments/ User_Segments视图中,可以看清数据段的结构。
Oracle中的段可以分成4种类型:数据段、索引段、回滚段、临时段。
数据段是与数据库对象相对应,一般一个数据库对象对应一个数据段。
索引段用来存储系统、用户的索引信息。
回滚段用来存储用户数据修改前的值,回退段与事务是一对多的关系,一个事务只能使用一个回退段,而一个回退段可存放一个或多个事务的回退数据。
每个表都有一个对应的回滚段,其名称和数据表的名字相同。
一个对象创建出来之后,在segment层次上是分配一个分区extent和八个数据块block。
有一个问题需要注意,通常我们的数据段是与数据对象相关。一个数据对象对应一个segment。但是,分区表的时候,一个分区要对应一个segment对象。还有就是,segment对象是可以指定存储在那个表空间里,实现存储划分的基础也就在于此。不同类型的segment划分建立在不同的表空间里,才有可能存放在不同的文件中,最后分布在不同的物理存储。
只有分区表存在分开存储的可能。
一般一个对象是不会跨物理存储进行存放的,分区表是对应的多个segment。所以,分区表分开存储空间是可能的。
四、表空间(Tablespace)
表空间是Oracle数据库最大的逻辑结构。
一个Oracle关于祖国的名言数据库在逻辑上由多个表空间组成,一个表空间只隶属于一个数据库。
建立一个表空间的时候,是需要指定存储的文件。一个表空间可以指定多个数据文件,多个文件可以在不同的物理存储上。
一个表空间可以有多数据文件,但是一个数据文件只能属于一个表空间。
表空间通过V$Tablespace进行访问。
Bigfile,是一个标志位,标志表空间是不是所谓的大文件表空间。
Flashback_On,表示表空间的闪回特性是否开启。
表空间的作用:
1、控制数据库占用的磁盘空间
2、dba可以将不同数据类型部署到不同的位置。这样有利于提高i/o性能,同时利于备份和
恢复等管理操作。
五、Schema
Schema是一个组织概念,是来自于经典数据库理论范畴。在Oracle剑网三任务大全中,Schema就是一个组织概念,一个User对应的就是一个Schema。
Schema 为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的 Schema 下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个Schema,Schema 里面包含了各种对象如:Tables,Views,Sequences,Stored Procedures,Synonyms,Indexes,Clusters,And Database Links。
一个用户(User)一般对应一个 Schema,该用户的 Schema 名等于用户名,并作为该用户缺省的 Schema。这也就是我们在企业管理器的 Schema 下看到 Schema 名都为数据库用户名的原因。Oracle 数据库中不能新创建一个 Schema,要想创建一个 Schema,只能通过创建一个 User 的方法解决(Oracle 中虽然有 Create Schema 语句,但是它并不是用
来创建一个 Schema 的),在创建一个 User 的同时为这个 User 创建一个与用户名同名的 Schem 并作为该用户的缺省 Shcema。即 Schema 的个数同 User 的个数相同,而且 Schema 名字同 User 名字一一对应并且相同,所有我们可以称 Schema 为 User 的别名,虽然这样说并不准确,但是更容易理解一些。
一个 User 有一个缺省的 Schema,其 Schema 名就等于用户名,当然一个 User 还可以使用其他的 Schema。如果我们访问一个表时,没有指明该表属于哪一个 Schema 中的,系统就会自动给我们在表上加上缺省的 Sheman 名。比如我们在访问数据库时,访问 Scott 用户下的 Emp 表,通过Select * From Emp; 其实,这 Sql 语句的完整写法为 Select * From Scott.Emp。在数据库中一个对象的完整名称为 Schema.Object,而不属 User.Object。类似如果我们在创建对象时不指定该对象的 Schema,在该对象的 Schema 为 User 的缺省 Schema。这就像一个 User 有一个缺省的 Tablespace,但是该 User 还可以使用其他的 Tablespace,如果我们在创建对象时不指定 Tablespace,则对象存储在缺省 Tablespace 中,要想让对象存储在其他 Tablespace 中,我们需要在创建对象时指定该对象的 Tablespace。
Schema 是数据库对象的逻辑归属和分类,而 Tablespace 是数据库对象的物理和实际存放位置。
六、分区表
Oracle的分区表可以包括多个分区,每个分区都是一个独立的段(SEGMENT),可以存放到不同的表空间中。查询时可以通过查询表来访问各个分区中的数据,也可以通过在查询时直接指定分区的方法来进行查询。
分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。
七、Create Table
当我们创建了一个表,即使我没有插入任何一行记录, ORACLE还是给它分配了8个块。当然这个跟建表语句的INITIAL参数及MINEXTENTS参数有关。如:
STORAGE
(
腾讯qq号码申请INITIAL 64K
MINEXTENTS 1
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论