Chinaunix首页 | 论坛 | 博客
  • 博客访问: 296178
  • 博文数量: 60
  • 博客积分: 1437
  • 博客等级: 中尉
  • 技术积分: 632
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-10 14:12
文章存档

2012年(7)

2011年(53)

分类: Oracle

2011-02-14 21:54:16

看看之前的笔记,还是算用功的吧,在甲方的时候可以好好研究Oracle,现在呢.....唉.....

目标
 描述Segment Header的结构
 解释Free List和ASSM 的Segment Header
 描述extent map block 的结构
1.Segment Header
    一个Segment 的头块包含一些信息,不管这个Segment是一个Table、一个Index还是undo、temporary或者是一个cluster。
    Segment Header管理空闲空间(Free Space)有以下两种方式:
1)、Free List Managed (FLM)
2)、Automatic Segment Space Managed(ASSM)
   Segment Header管理着分配给Segment的extent。

Segment Header是一个Segment的第一个extent的头块(第一个块)。在FLM管理的Segment中,header block始终是segment 的第一个块:

在ASSM管理的Segment中,bitmap block始终出现在segment的第一个extent的header block(Segment Header)之前:

注意:关于ASSM管理的Segment的详细信息将在后面介绍
Segment Header中包含的信息包括:分配给segment的extent信息及segment中的空闲空间的情况。
2.Segment Header有哪些类型
Oracle Server在Header Block中存储着一个block的类型。在Oracle中包含以下一些Segment Header类型

ID

Type

Decimal

Hex

1

11

12

14

15

16

17

18

23

29

32

33

34

35

36

37

0x01

0x0b

0x0c

0x0e

0x0f

0x10

0x11

0x12

0x17

0x1d

0x20

0x21

0x22

0x23

0x24

0x25

undo segment header

data file header

data segment header with FLG(Free List Group) block

unlimited undo segment header

unlimited save undo segment header

unlimited data segment header               

unlimited data segment header with FLG blocks

extent map block

bitmapped segment header

bitmapped file space header                 

first level bitmap block                    

second level bitmap block                   

third level bitmap block                    

Pagetable segment header block              

Pagetable extent map block                  

System Managed Undo Extent Map Block        

3.相关术语
Free List
一个Free List是一个块链表,它们有确定的空闲空间(Free Space),链表上的块是
通过在block header 中的Data Block Address(DBA)指针链接在一起的,Segment Header
指出了链表的头部。
Free List Segment (FLM)
    一个 Free List Segment是一个segment,这个segment的空闲空间(free space)是由free list来管理的。所以叫做Free List Segment。
Bitmap
一个bitmap是一个描述segment中的每一个block的填充状态的map。这个map中包含了不同的块状态。当一个新行insert进来时,map会去搜寻足够的空间来存放新行。当一个block变得more full(或者less full)时,它的新的状态会反映到bitmap中去。
ASSM Segment
    这种segment的free space是用bitmap来管理的。
High-Water Mark
    是指向下一个DBA的指针,指向块曾经insert到过的位置(Data Block Address),这个位置存在Segment Header中,在它之上的块是没有格式过的块,对insert来说这些块是不可用的。
4.FLM vs. ASSM Segments
ASSM Segment有以下FLM Segment没有的优点:
  使用简单
是用很少的参数,不需要诸如FREELIST、FREELIST GROUPS、PCTUSED等的参数了。
   提高空间的利用率,特别是对那些行的大小经常可变的对象来说尤为如此。
   提高并发空间操作的性能(提高并发访问的性能)   
   提高了在多instance环境中的性能
5. FLM的Segment Header

6. Space in a Segment

上图中一共10个block。
Segment Header结构中包含一个extent map,它指出了分配给每个Table的extent的大小及位置。
7.Segment Header Dump:FLM Segment

现在我们向表中插入一些数据再dump出Segment Header来看看有什么变化:

我们可以根据最后一个extent rdba地址来计算出HWM的位置:

0x0040fa89+5a=0x0040fae3 5a 90转换为16机制的值)

可以看到0x0040fae3刚好是HWM的位置。

最后一列:

没填数据之前:

SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000

填充数据之后:

SEG LST:: flg: USED   lhd: 0x0040fade ltl: 0x0040fae2

flgflag)表示该freelist是否被使用

lhdlist header)表示位于该list中的第一个可用blockdba

ltllist tail)表示位于该list中的最后一个可用blockdba,这个block必定位于HWM之下,这这里HWM的地址是0x0040fae3ltl的地址是0x0040fae2刚好是HWM之下的块。从

0x0040fade0x0040fae2一共有5个块在free list中。

       我们删除一部分数据再dump Segment Header来看看:

SQL> delete from nico_t1 where rownum<20000;

 19999 rows deleted.

 SQL> commit;

Commit complete.

 SQL> alter system checkpoint;

  System altered.

 SQL> exit                                    

Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Production

With the Partitioning, OLAP and Data Mining options

[oracle@pgtest ~]$ sqlplus /nolog

 SQL*Plus: Release 10.2.0.1.0 - Production on Thu Feb 28 12:58:54 2008

 Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 SQL> conn /as sysdba

Connected.

SQL> alter system dump datafile 1 block 63017;

 System altered.

 SQL>


再删一次数据后:

xid 是Transaction ID。

可以看到free list中增加了一些可用的空间,但是HWM却没有变化


阅读(5751) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~