解释说明:表空间是一个逻辑概念:=> 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

最新文章

  1. html中table边框属性
  2. [LeetCode] Merge Intervals 合并区间
  3. 【IOS】自定义可点击的多文本跑马灯YFRollingLabel
  4. Evolutionary Computing: Assignments
  5. 安装glue,用glue批量处理图片的步骤
  6. Python 黑魔法 --- 描述器(descriptor)
  7. Windows重新建立图标缓存
  8. C#调用java程序
  9. oracle是数据库的学习第一节:数据库的安装
  10. 我的web小游戏【持续更新中】
  11. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
  12. bzoj-3450 Easy概率DP 【数学期望】
  13. 【Java基础】通过getResourceAsStream() 加载资源文件
  14. 「ZJOI2016」旅行者 解题报告
  15. django的中间件:process_request|process_response|process_view|process_exception
  16. C++外观模式和组合模式
  17. 10.11 Linux网络相关 10.12 firewalld和netfilter 10.13 netfilter5表5链介绍 10.14 iptables语法
  18. adb(android debug bridge)命令
  19. 磁盘 -&gt; 硬盘 -&gt; c盘 &amp;&amp; 内存
  20. ViewFlipper 淘宝头条 轮播 自动切换

热门文章

  1. npm 和bower之间的区别
  2. Android Intent 基本使用及对象构成
  3. SoDiaoEditor电子病历编辑器更新至V3版本,愿与各位一路同行!
  4. poj2991 Crane(线段树+集合)白书例题
  5. [BZOJ 1190][HNOI2007]梦幻岛宝珠
  6. C#添加背景音乐
  7. 简易web服务器
  8. 201621123025《Java程序设计》第二周学习总结
  9. python网络爬虫,知识储备,简单爬虫的必知必会,【核心】
  10. JAVA_SE基础——19.数组的定义