ORACLE的块、区、段、表空间简述
ORACLE的块、区、段、表空间简述
ORACLE在逻辑存储上分4个粒度:块、段、区、表空间。
2.1块: 是粒度最⼩的存储单位,默认的块⼤⼩是8K,(为什么Oracle要⽤数据块作为最⼩单位?因为,⽆论是Windows环境,还是Unix/Linux环境,他们的操作系统存储结构和⽅式、甚⾄字符排列的⽅式都是不同的。所以,Oracle利⽤数据块将这些差异加以屏蔽,全部数据操作采⽤对Oracle块的操作,相当于是对底层环境的⼀层封装。)ORACLE每⼀次I/O操作也是按块来操作的,也就是说当ORACLE从数据⽂件读数据时,是读取多少个块,⽽不是多少⾏。每⼀个Block ⾥可以包含多个row。【延伸:mysql是页、区、段,pg最⼩单位也是块,本质⼀样。】
2.2区:由⼀系列相邻的块⽽组成,这也是ORACLE 空间分配的基本单位,举个例⼦来说,当我们创建⼀个表A时,⾸先ORACLE会分配⼀区的空间给这个表,随着不断的INSERT数据到A表,原来的这个区容不下插⼊的数据时,ORACLE是以区为单位进⾏扩展的,也就是说再分配多少个区给A表,⽽不是多少个块。在进⾏存储数据信息的时候,Oracle将分配数据块进⾏存储,但是不能保证所有分配的数据块都是连续的结构。所以,出现分区extent的概念,表⽰⼀系列连续的数据块集合。
科比语录--查看区信息
SET LIN 200 PAGES 999
全球十大货币
COL OWNER FOR A20
COL SEGMENT_NAME FOR A20
COL SEGMENT_TYPE FOR A10
COL TABLESPACE_NAME FOR A10
select  OWNER,SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS  from
dba_extents
where TABLESPACE_NAME='USERS' AND OWNER='SCOTT'  order by 7;
从视图中,我们可以清晰看出分区的⼏个特点:
⾸先分区是带有段特定性的。数据段segment是分区的上层组织单位,⼀个数据库对象对应⼀个segment,数据库对象是归属在不同的schema(owner)上的。所以,通过不同的数据段名称、不同的owner,乃⾄不同的tablespace表空间信息,就可以定位到数据区extent的信息描述。
另⼀部分信息是关于该区extent的分配信息,如所在⽂件编号,起始数据块block编号和数据块数量等内容。图中可以看到由于EXTENT_ID⼀致时,只需要定位开始的block就知道这些块是否连续,⼀般block_id间隔8。
这⾥再做⼀个测试,判断批量插⼊是否是连续的块:
--创建测试表a:
create table  scott.a(id number) tablespace users;
insert into scott.a  SELECT OBJECT_ID FROM DBA_OBJECTS;
御封
commit;
从EXTENT_ID不⼀致分布,可以看到插⼊的时候并不是连续块插⼊的,⽽且采⽤随机I/O的插⼊到不同的区中,但是⼜有⼀定的规律。
那么为什么要写⼊不同的区中呢?
猜想:
猜想:现在存储⼀般都使⽤磁盘阵列,提⾼存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并⾏的执⾏,每个磁盘执⾏属于它⾃⼰的那部分数据请求。这种数据上的并⾏操作可以充分利⽤总线的,显著提⾼磁盘整体存取性能。
怎么做人
所以应该是为了能够充分利⽤每块磁盘的性能,所以才要写到不的分区中,也就是说分区概念中的连续的块集合,应该是⼀种块逻辑连续的概念,在物理上也不是连续的。
这⾥做⼀个10046的读取测试,看看读取时的信息:
--10046测试
ALTER SESSION  SET EVENTS '10046 TRACE NAME CONTEXT FOREVER,LEVEL 12';
select count(*)  from scott.a;
select value  from v$diag_info where name='Default Trace File';
可以看到先对1690这个块(从dba_segments可以查到这个是个块头)做了⼀个单块读,获取其余块的信息,然后进⾏了⼀系列的多块读,可以发现⼀次读取的最⼤块数为⼀个extent的⼤⼩,这⾥为8,所以分区在读取数据的意义应该是有⼀个限流的作⽤。
这⾥再扩展⼀个参数:db_file_multiblock_read_count,可以加⼤每次I/O获取的最⼤块数,但是还是会受extent⼤⼩的影响。
--创建测试表c:
我们都在用力的活着是什么歌名create table scott.c(id number) tablespace users;
insert into scott.c SELECT  OBJECT_ID FROM DBA_OBJECTS;
insert into scott.c SELECT  OBJECT_ID FROM DBA_OBJECTS;
commit;
--设参数为20
alter system set db_file_multiblock_read_count=20;
--10046测试
ALTER SESSION  SET EVENTS '10046 TRACE NAME CONTEXT FOREVER,LEVEL 12';
select count(*)  from scott.c;
select value from v$diag_info  where name='Default Trace File';
--看到C表信息,看到EXTENT_ID=16为128个块
--参数db_file_multiblock_read_count设为20
--10046报告
从上图可以看到多块读的数量收到了参数db_file_multiblock_read_count的限制。所以⼀些olap系统上可以提⾼这个参数,另外增⼤块⼤⼩来提⾼单次I/O的效率。
--第三个实验是把db_file_multiblock_read_count设为256,全表扫描C表,⼀次最⼤只能读取128这个块,因为这个参数不能超过⼀个extent的⼤⼩。
逻辑概念与物理存储关系图
2.2段:
段:是由⼀系列的区所组成,⼀般来说,当创建⼀个对象时(例如:表,索引),就会分配⼀个段给这个对象。所以从某种意义上来说,段就是某种特定的数据。如CREATE TABLE A,这个段就是数据段,
⽽CREATE INDEX ON A(ID), ORACLE同样会分配⼀个段给这个索引,这是⼀个索引段。查询段的信息可以通过数据字典: SELECT * FROM DBA_SEGMENTS来获得。
2.4表空间: Oracle的表空间属于Oracle中的存储结构,是⼀种⽤于存储数据库对象(如:数据⽂件)的逻辑空间,是Oracle中信息存储的最⼤逻辑单元,其下还包含有段、区、数据块等逻辑数据类型。表空间是在数据库中开辟的⼀个空间,⽤于存放数据库的对象,⼀个数据库可以由多个表空间组成。可以通过表空间来实现对Oracle的调优。
表空间实际上是由若⼲个数据⽂件来构成的,数据⽂件的位置和⼤⼩可以由我们⾃⼰来决定。数据被存放在表空间中的数据⽂件中。
管理表空间的⽅式:
字典管理表空间(Dictionary-ManagedTablespace简称DMT)
8i以后出现的⼀种新的表空间的管理模式,通过本地位图来管理表空间的空间使⽤。
本地管理表空间(LocallyManaged Tablespace简称LMT)
8i以前包括以后都还可以使⽤的⼀种表空间管理模式,通过数据字典管理表。
⼀、本地管理表空间的由来:
在Oracle8I的版本中,Oracle推出了⼀种全新的表空间管理⽅式:本地化管理的表空间。所谓本地化管理,就是指Oracle不再利⽤数据字典表来记录Oracle表空间⾥⾯的区的使⽤状况,⽽是在每个表空间的数据⽂件的头部加⼊了⼀个位图区,在其中记录每个区的使⽤状况。每当⼀个区被使⽤,或者被释放以供重新使⽤时,Oracle都会更新数据⽂件头部的这个记录,反映这个变化。
--查看表空间管理⽅式
select tablespace_name,extent_management, allocation_type from  dba_tablespaces;
Oracle之所以推出了这种新的表空间管理⽅法,让我们来看⼀下这种表空间组织⽅法的优点:
1. 本地化管理的表空间避免了递归的空间管理操作。⽽这种情况在数据字典管理的表空间是经常出现的,当表空间⾥的区的使⽤状况发⽣改变时,数据字典的表的信息发⽣改变,从⽽同时也使⽤了在系统表空间⾥的回滚段。
孙红雷 叶璇2.本地化管理的表空间避免了在数据字典相应表⾥⾯写⼊空闲空间、已使⽤空间的信息,从⽽减少了数据字典表的竞争,提⾼了空间管理的并发性。
数据⽂件的头部记录来管理空闲块,这样避免产⽣回滚信息,不再使⽤系统表空间⾥的回滚段。
3.从由数据字典来管理空闲块改为由数据⽂件的头部记录来管理空闲块
所以它⽀持在⼀个因为由数据字典来管理的话,它会把相关信息记在数据字典的表⾥,从⽽产⽣回滚信息。由于这种表空间的以上特性,所以它⽀持在⼀个表空间⾥边进⾏更多的并发操作,并减少了对数据字典的依赖。
表空间⾥边进⾏更多的并发操作
⼆、本地管理表空间管理机制
8i之前所有的表空间都是采⽤字典管理模式,ORACLE需要有⼀个机制来管理表空间中各数据⽂件的这些分配的或未分配的空间,为了跟踪这些可以使⽤的空间(包括未分配使⽤的和可以重复使⽤的),对于每⼀个空间,我们必须知道:
1、这个可⽤空间位于什么数据⽂件;
2、这个空间的尺⼨是多⼤;
3、如果它在⽤了,是哪⼀个段占⽤的这个空间;
为了确保能保存以上的信息,ORACLE⽤了两个数据字典表:UET$(已使⽤的区间)或FET$(空闲空间):
查询该表可以看到,每个使⽤空间或空闲空间(不⼀定是⼀个extent,可以是多个extent)都在该表中对应了⼀⾏。它的⼯作⽅式是当⼀个段被删除的时候,ORACLE就移动UET$中相应的⾏到FET$,这个过程的发⽣是连续的,⽽且可能发⽣等待。当并发性很⾼的时候,数据字典的争⽤就来了。另外有⼀个问题就是,当表的空间很不连续或表空间有⼤量的碎⽚引起这两个表的增⼤,那么也就会引起数据库性能上的下降。
本地管理表空间
本地管理表空间正是为了解决这⼀问题来的,在表空间的空间管理上,ORACLE将存储信息保存在表空间的头部的位图中,⽽不是保存在数据字典中。通过这样的⽅式,在分配回收空间的时候,表空间就可以独⽴的完成操作也不⽤与其它对象关系。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。