ORACLE的块、区、段、表空间简述
ORACLE在逻辑存储上分4个粒度:块、段、区、表空间。2.1块: 是粒度最小的存储单位,默认的块大小是8K,(为什么Oracle要用数据块作为最小单位?因为,无论是Windows环境,还是Unix/Linux环境,他们的操作系统存储结构和方式、甚至字符排列的方式都是不同的。所以,Oracle利用数据块将这些差异加以屏蔽,全部数据操作采用对Oracle块的操作,相当于是对底层环境的一层封装。)OR
--查看区信息 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; |
--
创建测试表a:
create table scott.a
(id number) tablespace users;
insert into scott.a SELECT OBJECT_ID FROM DBA
_OBJECTS;
commit;
|
--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'; |
--
创建测试表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';
|
--查看表空间管理方式 select tablespace_name,extent_management, allocation_type from dba_tablespaces; |
2.本地化管理的表空间避免了在数据字典相应表里面写入空闲空间、已使用空间的信息,从而减少了数据字典表的竞争,提高了空间管理的并发性。
3.从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生回滚信息,不再使用系统表空间里的回滚段。因为由数据字典来管理的话,它会把相关信息记在数据字典的表里,从而产生回滚信息。由于这种表空间的以上特性,所以它支持在一个表空间里边进行更多的并发操作,并减少了对数据字典的依赖。
二、本地管理表空间管理机制
8i之前所有的表空间都是采用字典管理模式,ORACLE需要有一个机制来管理表空间中各数据文件的这些分配的或未分配的空间,为了跟踪这些可以使用的空间(包括未分配使用的和可以重复使用的),对于每一个空间,我们必须知道:
1、这个可用空间位于什么数据文件;
2、这个空间的尺寸是多大;
3、如果它在用了,是哪一个段占用的这个空间;
为了确保能保存以上的信息,ORACLE用了两个数据字典表:UET$(已使用的区间)或FET$(空闲空间):
查询该表可以看到,每个使用空间或空闲空间(不一定是一个extent,可以是多个extent)都在该表中对应了一行。它的工作方式是当一个段被删除的时候,ORACLE就移动UET$中相应的行到FET$,这个过程的发生是连续的,而且可能发生等待。当并发性很高的时候,数据字典的争用就来了。另外有一个问题就是,当表的空间很不连续或表空间有大量的碎片引起这两个表的增大,那么也就会引起数据库性能上的下降。
更多推荐
所有评论(0)