01.05.07

DS302 Data Management 之extent and segment space management

Posted in DSI 笔记 at 9:43 am by David.Guo

目标
描述段头结构
描述片管理
描述临时表和永久表的区别
描述排序段中的片管理

段头
段中的第一个块
  表,索引或者聚集
通过一下方法管理空闲空间
  控制片从段中获取空间
  将块方在空闲列表上
段头是段中的第一个片的第一个块.他包含的信息有段中已经分配的片以及段中空闲的片.段头由一下几个不同的片段组成
  片控制
  片表
  段头控制
  段空闲空间
  事务空闲空间
片控制以及片管理结构提供当前分配的片的信息.段空闲空间以及事务空闲空间结构包含空闲列表信息.

段内的空间
段头中的结构包含了一个片地图指示了表中分配的片的大小和位置.
高水位标记HWM是指向插入的行到达的最高数据块地址(DBA)的.
在HWM以下的块是在段的生命周期内曾经插入行使用了的.空闲列表区域包含了空闲超过了PCTUSED的数据块的信息.仅仅当头和尾都被指定了,并且在列表中数据块本身指向下一个块的指针被发现.

段头dump
当设置了无限片的时候(或者是maxextent设置的超过了块大小限制),当段头中可用的槽或者是片地图块被使用完的时候,段可以包含附加的片地图块.
片控制头中的区域’last map’和’map#’指示了下一个地区快以及总共的地图块.区域’offset’是指向最后一个片地图的指针.
HWM结构包含了最后一个包含数据的最高的块的DBA.如果这个HWM是片的分界,则这个DBA可能会超出段的可实际可分配的.如果HWM是一个包含在EMB中的骗.片ID和快数字(ext#和blk#)包含HWM支持,作为一个片地图块(EMB),以及在地图块内的偏移.
磁盘锁结构用来作为片地图更新的流水.更新事务的ID(XID)的值赋给他.
片地图包含了每个片的第一个DBA以及片数目.

段视图
视图DBA_SEGMENTS和DBA_EXTENTS是和段非常有用的视图.很多这里的信息也是在段头中发现的.因此一些可变的属性,例如MAXEXTENTS,MINEXTENTS以及NEXT也可以在这里被发现,他们是基于基表SEG$和UET$的.
SEG$包含了属于一个段的信息,UET$包含了已经使用了的片的信息(相对的,在FET$中包含了空闲的片的信息).SEG$可以映射到TAB$(包含列数,行数,块数,pctfree,pctused,链接行数,平均行长度等等)通过DBA关联到文件号和块好.TAB$可以映射到COL$来获得更多的信息通过OBJECT_ID(OBJ#)

片分配
片是连续的oracle数据块组成的,可以是以下的状态:
  空闲:可以被使用的,在FET$中
  已使用:属于一个段了,在UET$中
片是连续的数据块.如果被给定了大小,那么即可以是空闲的,也可以属于一个段.
如果片是空闲的,那么一个相应的入口在FET$中.视图DBA_FREE_SPACE中会显示这个空闲入口
片也可以是属于一个段的,例如,一个表,一个索引,一个回滚段或者是一个排序段.这些片会有入口在UET$中.视图DBA_EXTENTS会显示这些信息
注意:一个表空间中有上千的骗,可能是引起ALTER TABLESPACE …COALESCE,DROP TABLESPACE …以及可能SHUTDOWN需要很长的时间.这是因为,oracle需要从FET$中删除对应的信息.
对于本地管理表空间,不存在这样的问题

向段中增加一个片
在下列的情况下,需要向一个段中增加片
  寻找5倍oracle块大小
  检查在数据字典高速缓存中是否有这样的空闲片.
  如果在高速缓存中没有找到,就到磁盘上去继续寻找
最初,oracle从数据字典高速缓存中去寻找指定大小的空闲片.如果不成功,oracle将扫描FET$来看有没有满足的或者是超过大小的.
可用文件有一个数组,在文件头中,是构造表空间的,以上的扫描会在每一个文件中进行.
第一个超过大小的片会被标记,但是扫描会继续进行看是否有完全匹配大小的.如果完全匹配大小的不存在,oracle就将第一个匹配的片分裂为匹配大小的和剩余的.但是,分裂仅仅是在剩余的代销超过KTS_M
IN_EXTENT或者是用户配额不允许分裂.
如果片没有发现,邻近的空闲片被结合,并且重新开始扫描.
如果oracle还是无法找到可用的片,并且请求时间快达到了,他会回去从头开始扫描.
最后,尝试在属于这个表空间的数据文件中制造一个这样的片.如果成功,服务将可以得到合适大小的片.

片搜索算法
片分配的算法如下:
1:如果表空间的最小大小(MS)被设置了,保证请求大小(RS)比MS大,并且会向MS的整数倍靠拢;
2:如果MS没有设置,那么向最近的5的倍数的数据块靠拢.这可以防止小的,不可用的片被创建.当RS比5个数据块小或者是超过用户配额,则不会进行靠拢操作;
3:扫描数据字典高速缓存,看是否有指定大小,如果有,跳到步骤8;
4:如果缓存扫描失败.那么扫描FET$中大于或者等于RS的
  如果刚好匹配RS,锁定入口并且跳到步骤8,否则继续读FET$记录;
  如果尺寸过大,记住记住第一个FET$入口,当完成扫描的时候,得到这个来匹配;
  如果一直到最后都没有发现,但是有一个更大的片,那么分裂片为两个部分,请求的大小和剩余的,并且跳到步骤8
5:没有更大的片存在,那么合并空闲片,如果有,合并后,重新搜索;
6:如果合并没有作用,恢复到原始的大小,并且重试;
7:尝试扩展表空间的文件,如果成功,重试搜索,否则报空间错;
8:最后一步,入口被发现并且可以在数据字典高速缓存中被锁定,这个时候,oracle需要更新必要的数据字典表,从FET$中删除记录,添加尽力到UET$中,更新SEG$来反映新的块,并且改变段投片地图来指示新片被增加进来了.

非典型的片操作
一些非典型的片操作有:
  在HWM以下增加片;
  合并多个段(在并行操作中)
  段截断
  隐含的或者明确的文件扩展或者截断

在HWM下增加片
当片被增加到段和实例是使用命令:
alter table <>allocate extent(size n instance m)
片不能被增加到HWM上面,并且他将对所有的实例可见.oracle将把片增加到片地图的开始(在initial后),在HWM下,并且在空闲列表中.空闲列表属于对应的空闲列表组的块.空闲列表仅仅是对哈希这个空闲列表组快的实例有用,这可能导致这个增加指示对特定的实例有效.
因为片是增加到片地图的开始,因此片地图的入口顺序和片在UET$中的入口顺序是不同的.每一个在UET$中的片都有一个extent#,这个是从段头中得到的,在UET$中的extent#并不会匹配在段头中的片地图的入口顺序.
这个操作可能有危险,bug268073和bug322392有描述.

合并多个段
一些并行操作(例如,并行加载,并行CREATE子句)临时的将对象划分为多个段.每个段独立处理的,必须在操作的最后合并到一起.合并的操作是重复的,每次两个段合并.如果你考虑段是FROM和TO的操作,那么操作可以包含如下:
1:开始一个空间事务;
2:将FROM的段规整到HWM.将高于HWM的所有片从UET$中删除,并且将他们插入到FET$中.并且在FROM的段的片地图中删除对应的片.然后将包含HWM的片分裂.一个UET$的入口标记新的片包含了HWM,一个FET$入口创建来标记在HWM上的片.
3:从UET$中将所有的FROM段的片入口删除,并且为TO段创建相同的入口.并且TO段的片地图入口被更改.在这个点,TO段的UET$入口和片地图将反映FROM段的这些片.
4:将FROM段在SEG$中的入口删除,并且更新TO段的入口来反映这些新的段大小和片数目.
5:合并空闲列表信息:将FROM段的所有的空闲列表合并到主空闲列表上.将FROM段的主空闲列表的尾链接到TO段的主空闲列表,并且将FROM段的主空闲列表的头设置到TO段的主空闲列表中.
6:重新定义FROM段的段头和空闲列表组块,将他们作为空闲块,并且放到事务空闲列表中.
7:提交空间事务.

并行直接路径加载
算法的本质和并行直接路径加载一个段一样.当PARALLEL=TRUE时,这个进程将操作SQL*Loader函数使用直接路径模式,并且作一些类似并行插入,创建的操作.
每一个进程将在表上临时得获得一个段,并且有一个共享锁.临时段独立的加载,并且项目间没有通信,通过一个调整进程来控制他们完成.每一个临时段在合并阶段要经历片规整,在HWM上的所有块将被移除.可能会导致表中有一个意想不到的片大小.在oracle 8.0以上版本,临时段将忽略INITIAL参数,所有临时段大小为NEXT.如果失败,段将以临时段存在.SMON将清理这些临时段,但是可能要一段时间来处理.依赖于表空间中的可用空间,定时任务在临时段被移除前不会开始工作.

段截断
截断命令将清理段的所有空闲列表.他将导致HWM指向段头中片地图中的第一个块.他将有效的的移除段中的所有数据.如果你决定要重用这些段,那么oracle将移除在HWM以上的在UET$中的所有入口,但是在HWM以下的MINEXTENTS不会被移除.

什么是合并
一些邻近的小的片,他们不能满足空间要求(如果请求的空间大于他们任何一个的片大小).你可以结合邻近的片成为一个大块.这个结合的进程就是合并,并且在一些几种情况下发生:
需要的时候合并:
当你不能得到需要的空间,一个扫描算法发现需要结合步骤.这个步骤总是发生在搜索空闲空间的时候.
手工合并:
语句ALTER TABLESPACE COALESCE引起表空间进行空闲空间结合.
SMON合并:
这是SMON的后台任务之一.SMON仅仅在其他事务前执行8次结合.这个操作是在空间事务内,并且仅仅当表空间级别的PCTINCREASE>0的时候执行.

空闲空间合并
合并空闲空间发生在:
需要的时候,当空间管理要求
SMON的任务.
明确的指定
SMON可以设置10269事件来阻止他合并

合并的好处
合并可以获得如下好处:
当没有需要的合并被要求的时候,快速的相应空间请求;
避免错误的空间溢出环境
如果按需合并不被请求,那么对于新片的空间要求会快速的相应,因为不需要扫描的进程.
碎片可能会导致不是必须的空间溢出发生.例如,假定一个表空间有一个50块和一个150块的邻近空间.
当请求100块的片时.将从片2中分布.分裂为100块使用,和50块未使用的.现在,表空间中依然有100块空闲,但是是两个部分,并且被一个已经使用的分隔了,一次,下一个请求100块的片将看到没有连续的空间,因此表空间需要扩展.一个简单的例子,却是一个常见的情况.表空间的碎片的空闲空间,将无法使用.这不是一个高性能的环境,导致大量的空间浪费.通常在表空间中发生的段有:
  一个混合了短和长生命周期的.
  一个不一直的片大小.

临时段排序
排序的临时段可以是在永久表空间中,也可以是在临时表空间中.临时表空间仅仅用来排序,并且仅仅只能有临时段在其中.永久表空间可以有临时段和永久段在其中.
临时表空间创建的时候需要关键字TEMPORARY.ALTER TABLESPACE命令不能将永久表空间更改为临时表空间,同样,也不能将临时表空间修改为永久表空间.
当临时段创建在永久表空间中以后,他们作排序操作的最后要求的操作.如果排序操作的最后失败了,SMON将移除这些段.
另外一个方面,在临时表空间的临时段将作为一个单个的排序段存在.仅仅一个临时段在临时表空间上被创建,并且增长.他依据ST锁来创建,但是和其他的段不同的是他可以被所有的用户共享.一个片地图在SGA中保存.共享排序段提供了在临时段中的分配和回收,但是最后可能会导致一个ORA-1575错误.

监控排序段的使用
临时表空间
  V$SORT_SEGMENT
  V$SORT_USAGE
永久表空间
  V$SORT_USAGE(ORACLE8)
  SQL SCRIPTS/SYSTEMSTATE
在oracle8和以上版本中,监控排序操作将变得容易.视图v$sort_usage将显示使用了临时和永久表空间中的排序段的用户.
视图v$sort_segment将提供临时表空间中排序段增长的信息.该视图显示了类似片大小,当前用户数据,使用了的片,空闲片,最大大小,最大排序大小等信息.要明白,片大小是基于块大小的.

V$SORT_USAGE
从8.0版本开始,v$sort_usage被引入,让你可以通过系统来监测那个用户正在使用排序段.
但是,他不仅仅监控临时表空间,也显示了永久表空间的信息,因此要区分活动的排序的位置.
事实上,所有的临时段都是属于SYS用户的,这将导致无法识别到底是那个用户在作排序操作.视图v$sort_usage将只会显示SYS用户,但是,视图可以关联v$session来得到更多的信息.

有用的视图
DBA_SEGMENTS,DBA_EXTENTS
V$SORT_SEGMENT,V$SORT_USAGE
DBA_FREE_SPACE
DBA_FREE_SPACE_COALESCED
FET$,UET$,SEG$,TS$

Leave a Comment