解释说明:表空间是一个逻辑概念:=> oracle 逻辑概念段区块管理方式:

number one =》 tablespace

number two=> segments

Oracle新建一个对象,产生一个对象,这有啥需要管理的吗? 使用了一个延时段管理;

所以一般没人会回答表空间的管理是延迟段管理还是非延迟段管理,而是说区的管理方式,就是分配区的方式;

number three A:如何寻找空闲的区域,给新分配的区,安家落户。

Oracle区的分配的方式分两种: directory, local 字典、本地管理,字典管理基本被弃用; 那么Oracle分配区的方式有没有更细节的呢? 例如分配一个区,区分给他多大?

number three B:衍生出,如何对新生成的区,给它分配多大空间,第一种:默认,auto allocative,系统默认分配;第二种uniform size;

首先解释说明,区的空间大小如何衡量? 区是由连续的块组成,最初是8个块*8192Bytes=64kb ytes/

*** 相当于看人口,举例,家族迁移;发生战乱,从北方逃难,来到美丽的江西九江,九江的官员毕竟负责,来住可以,先统计人口,判断出,有500多号人,按照8个房间,一个房间住2个人的美好场景=32间房间左右,按照16个房间好管理的方式,分配了两个街道(区),每个街道16个房间(块);

如果是自动的呢? 官员不负责任,来了500个人,按照每个街道,分配8个房间;需要62个街道分配,分配12次;

但是官府有一套机制,分配到16个街道之后,官府自动增加分配区的大小,分配第16以后,官府决定大方一点,每个街道(区)分配128间房间,(麻烦,减少工作量)这样最少,也需要分配16个街道*8+ 2-3*128个块的方式分配===》也就是说,最少需要分配18次;

以上说明:仅限于理解,手动统一分配与自动的区别,实际还存在大量误差,概念可以先理解;

number four;以上分配空间都说了空间不够,分区;

如果是已经分配了区,但是Insert 一条数据,它去哪里存储呢?,块在哪里找呢? 段空闲管理方式;

number four A: manual手工,特征,并不是手动,而是相比较B,显得笨拙;

特点: 手工段空闲管理,在段的头部,段是逻辑概念,如何真时记录数据,归属于段的一堆块中,前三个块默认,就是管理单位,建立记录了一个free list的列表,存储什么样的数据? 存储记录空闲空间的块的信息;需要使用块时,去空闲列表,读取空闲块;并发访问会导致添加锁,其它事物等待,这种热快容易产生,buffer busy waits热快现象;访问时串行方式

number four B: auto:默认,我们存储数据,一般是无序的,哪个块有空闲,就往哪个块里面存储数据,正是因为没有顺序,所以访问表的数据,需要全表扫描;

自动段空闲块管理,采用的方式是在段的头部建立bitmap位图的方式记录块是否空闲,支持并发访问;

——————————————————————以上是原理,以下通过视图验证查询---

number one;

Aoracle database 11g 默认采用段延迟管理;

SQL> show parameter seg

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

deferred_segment_creation            boolean     TRUE

--延迟  段  创建=> ture  false;

什么是延迟管理,如果你创建的对象没有具体的数据存储,Oracle将不会给你分配存储区域,存储区域的管理是段,不会分配段给你;

---创建测试表,只创建表结构,没有数据

SQL> create table emp1 as select * from emp where 1=2;

---查询表的存储,段、区、块、大小

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

no rows selected

--插入数据测试

SQL> insert into emp1 select * from emp where rownum<2;

--再次查询

SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENTS from user_segments where segment_name='EMP1';

SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME,bytes/1024/1024 "M",BLOCKS,EXTENT

EMP1          TABLE              USERS                               .0625        8         1

---修改参数,取消延迟段分配管理,创建测试表,查询结果如下;

---alter system set deferred_segment_creation=false;

EMP2     TABLE              USERS                               .0625        8        1

-------------------------------------------------------------------------------------------------------

number two

空闲区的管理方式:数据字典管理与本地管理

数据字典管理:1.采取两个基表进行管理,free extent记录在数据字典表中的fet$、已经使用的记录在uet$;

2.当表插入数据,需要存储扩大空间存放数据,都需要访问fet$表,获取信息后;

3.需要对fet$、以及uet$两张表进行dml更改操作;

===》这就造成了,如果数据库中,大量的区扩张时,并发去访问修改以上两张表,消耗资源,等待分配;

本地管理:位图管理:权利下放,从两张表的权限放到每一个数据文件的手上;

1.每个表空间对每个数据文件的头部加入一个位图区,记录每个区的使用情况,当存储区发生改变使用或者删除,会对数据文件头部的位图进行修改;

2.因为如上的方式,回收或者分配,只需要在每个表空间的每个数据文件的数据文件头部进行修改,而且还是修改位图,效率高,并且减少了并发

--如何查询是表空间是位图管理:本地还是数据字典管理呢?

SQL> select TABLESPACE_NAME,CONTENTS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

TABLESPA CONTENTS  EXTENT_MAN ALLOCATIO SEGMEN

-------- --------- ---------- --------- ------

SYSTEM   PERMANENT DICTIONARY USER      MANUAL

SYSAUX   PERMANENT LOCAL      SYSTEM    AUTO

UNDOTBS1 UNDO      LOCAL      SYSTEM    MANUAL

TEMPTS1  TEMPORARY LOCAL      UNIFORM   MANUAL

USERS    PERMANENT LOCAL      SYSTEM    MANUAL

TBS_DICT PERMANENT DICTIONARY USER      MANUAL

extent_management列:directory代表数据字典,local代表本地位图管理;

directory已经被放弃选择了,此查询是因为手工艰苦,控制文件脚本修改了:删除了.EXTENT MANAGEMENT LOCAL  表空间本地管理,造成的效果类似,extent management directory;

.SQL> create tablespace abc datafile '/picclife/app/oracle/abc.dbf' size 10m extent management local/ directory;

-------------------------------------------------------------

number three:

表空间的管理,区分配多大空间:

首先提取测试环境:scott用户,默认是users表空间,对应的区管理分配的大小:

ALLOCATION_TYPE=》system 方式,代表系统自动管理,next_extent空值,最小64K/8K=8个块;

create table t1 as select * from emp;
select segment_name,extent_id,file_id,block_id,blocks from dba_extents where owner='SCOTT'
 and segment_name='T1';
SEGMENT_NAME     EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
--------------- ---------- ---------- ---------- ----------
T1                                          0          6       1648          8  ---虽然表中的数据存储,没有占满8个块的区域,但是Oracle最少还是一起分配了一个区8个块;
insert into t1 select * from t1; --增加数据
//////
480 rows created.测试

从第 十七个块,开始,每次分配128个数据块;

--测试环境查询了一个1G左右的表,是导入进去的,一个区存在;   blocks 8192个数据块;
成倍增加;
 
ALLOCATION_TYPE=》uniform  代表extent的分配方式一致:

SQL> select tablespace_name,initial_extent,next_extent,min_extents ,max_extents from dba_tablespaces;

TABLESPA INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS

-------- -------------- ----------- ----------- -----------

SYSTEM            16384       16384            1         505

SYSAUX            65536                             1  2147483645

TBS_DICT          40960       40960           1         505
ABC                    65536                            1  2147483645
YA                       65536                           1  2147483645
TBSA               1048576     1048576       1  2147483645

TEMPTS1         1048576     1048576           1

SQL> select 1048576/1024/1024 from dual;

1048576/1024/1024 -----------------                 1M

SQL> select 1048576/8192 from dual;  128个块---

1048576/8192 ------------          128

------------如上查询,tempts1是创建数据库默认选项next_extent对应的是1M大小,128个数据块,Oracle为每个一个区分配一个固定的128个块为单位的一个区;

SYSTEM=>USER: 代表可以控制next_extent的值:

SYSTEM   PERMANENT DICTIONARY USER      MANUAL

TBS_DICT PERMANENT DICTIONARY USER      MANUAL

--只要区的分配方式是数据字典管理,则区大小的分配就是user模式,代表可以自主分配;

数据字典,区大小分配方式;

SQL>  select 40960/8192 from dual;

40960/8192 ----------                   5           五个块

SQL> select 40960/1024/1024 from dual;

40960/1024/1024 ---------------        .0390625      ---实际多大,给多大,是否

-----------------------------------------------------------------------------------------------------------

number four :

以上说的都是如何寻找空闲的区,用来分配,给一个区分配多大空间;

如今一个现实的问题摆在你面前,直接问你,我爱你你嫁不嫁我,咋整,直接;

我有一条数据,需要存储,存在哪里?如何寻找:

来走进块的空闲区域管理:

段的空闲块管理:segment free block management;

1.manual

2.auto

块什么是空闲? 块分几部分: 块头,存储区域,空闲区域:一般空闲区域预留10%的区域;

1.manual=> segment header 段的前三个块默认块头部,建立一个free list列表记录空闲的块;

使用空闲列表,获取空闲块,并发访问free list ,其它insert事物处于等待状态,在segment header block会经常出现buffer busy waits热快事件,访问串行,存储满了之后,移除列表;

2.auto  =》在segment bitmap标识上可用的空闲块,0空闲1非空闲,支持并发访问;

SQL> select TABLESPACE_NAME,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces;

TABLESPA SEGMEN -------- ------

SYSTEM   MANUAL

SYSAUX   AUTO

SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSTEM'

SYSTEM SYS_LOB0000000474C00021$$ LOBSEGMENT                  1               1

SQL> select tablespace_name,SEGMENT_NAME,SEGMENT_TYPE,FREELISTS,FREELIST_GROUPS from dba_segments where tablespace_name='SYSAUX'

SYSAUX           BSLN_TIMEGROUPS_PK             INDEX

------以上为查询:

语言描述:当数据对象插入数据,假设为manual管理方式,pctfree=20,代表,数据块空间存储达到80%,数据块将被移除空闲列表,随着数据的删除,当数据块的使用百分比低于参数:pctused参数的设置时,加入空闲列表;空闲链表中,竞争压力强大;ASSM管理

Auto Segment Space Management:

为了解决上述的问题,通过位图有效快速解决存储扩张和剩余区块free block:改善段的存储管理;

ASSM管理模式下,insert 通过扫描位图查找可用的Block:

参数:pctfree还需要,但是低于此数值,也不会从位图删除,而是记录状态,可用为后续的update更改操作保留行数据增长预留使用;

PCTUSED参数,将被废弃,不需要记录使用百分比;

FREELIST  FREELIST GROUPS将无效;

新的管理方式使用位图的机制对块进行追踪,没个块的大小,状态使用了:>75%,50%-75%,25%-50%,<25%,四个状态代替以前的pctused;

ASSM管理最大优势,位图减轻缓冲区等待,Buffer busy wait热快的产生;

---更详细内容看大神-如下网址链接

http://book.51cto.com/art/201108/288125.htm

Oracle表空间的管理方式的更多相关文章

  1. oracle表空间的管理

    1.创建表空间 CREATE TABLESPACE TBS_TR_DATA DATAFILE '/oradata/rTBS_TR_DATA_001.dbf' SIZE 64G EXTENT MANAG ...

  2. Oracle表空间满处理方式

    一.查询表空间常规语句 1.查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME)         "表空间名", D.TOT_GROOTTE_MB   ...

  3. ORACLE表空间管理维护

    1:表空间概念 在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示, ...

  4. oracle 表空间管理

    1.创建表空间 03:01:55 sys@ORADB11G> create tablespace TSPITR datafile '/u01/app/oracle/oradata/TSPITR0 ...

  5. oracle表空间创建及管理

    一.数据文件和数据库逻辑存储结构: 一个表空间包含一个或多个数据文件,一个表空间包含一个或多个段,一个段包含一个或多个区,一个区包含一个或多个连续的数据库块,一个数据库块包含一个或多个操作系统块.段是 ...

  6. 【转】Oracle 表空间与数据文件

    --============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或 ...

  7. 【基础】Oracle 表空间和数据文件

    多个表空间的优势:1.能够将数据字典与用户数据分离出来,避免由于字典对象和用户对象保存在同一个数据文件中而产生的I/O冲突2.能够将回退数据与用户数据分离出来,避免由于硬盘损坏而导致永久性的数据丢失3 ...

  8. ORACLE表空间

    在ORACLE数据库中,所有数据从逻辑结构上看都是存放在表空间当中,当然表空间下还有段.区.块等逻辑结构.从物理结构上看是放在数据文件中.一个表空间可由多个数据文件组成. 如下图所示,一个数据库由对应 ...

  9. Oracle 表空间与数据文件

    -============================== --Oracle 表空间与数据文件 --============================== /* 一.概念 表空间:是一个或多 ...

随机推荐

  1. Java ORM Hibernate 入门笔记

    一.下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库).OGM(NoSQL数据库).Search(对象全文检索).Validator的工具. OR ...

  2. 后台返回null iOS

    1.第一种解决方案 就是在每一个 可能传回null 的地方 使用  if([object isEqual:[NSNUll null]]) 去判断 2.第二种解决方案 网上传说老外写了一个Categor ...

  3. [转]C++ 初始化列表的初始化顺序

    构造函数初始化列表仅用于初始化成员的值,并不指定这些初始化执行的次序.成员被初始化的次序就是定义成员的次序.第一个被定义的成员先被初始化,依次类推.一般,初始化的顺序无关紧要,然而,如果一个成员是根据 ...

  4. Java基础学习笔记二十四 MySQL安装图解

    .MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Compl ...

  5. PTA的使用简介

    PTA(Programming Teaching Assistant)是PAT(Programming Ability Test)的配套练习平台. 1.关于PAT PAT(Programming Ab ...

  6. Beta第三天

    听说

  7. C语言博客-指针

    一.PTA实验作业(5分) 题目1:6-1 两个4位正整数的后两位互换 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明. 无 题目2:6-3 ...

  8. NetFPGA Demo ——reference_router_nf1_cml

    NetFPGA Demo --reference_router_nf1_cml 前言 本博文主要介绍了reference_router_nf1_cml该demo的一路运行,以及一路上艰难跑通遇到的坑. ...

  9. Android接受验证码自动填入功能(源码+已实现+可用+版本兼容)

    实际应用开发中,会经常用到短信验证的功能,这个时候如果再让用户就查看短信.然后再回到界面进行短信的填写,难免有多少有些不方便,作为开发者.本着用户至上的原则我们也应该来实现验证码的自动填写功能,还有一 ...

  10. linux系统命令学习系列-用户切换命令su,sudo

    先复习一下上节内容: 用户组添加groupadd 用户组修改groupmod 用户组删除groupdel 作业创建一个id为501的组group1,然后改成group2, 同时id变为502,最后删除 ...