设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 数据库开发 >> [Freelists Internal] 关于Freelists和Freelist Groups的研究
精品推荐
数据库开发点击TOP10
·MYSQL 新版出现 Client does not support authentication protocol requested by server; consider upgrading MySQL client解决办法
·生成助记码(取汉字的第一个字母)
·ORA-01034错误的解决办法
·ORACLE数据库管理员的职责
·将DW数据窗口导出为EXCEL文件的方法(整理)
·Oracle中分区表的使用
·SQL Server 2000+ MS WIN2003群集服务配置
·SQL中UNION 与 UNION ALL 的区别
·ORA-00257: archiver error. Connect internal only, until freed.
·Oracle备份与恢复案例
编程开发点击TOP10
·数字小键盘指法练习
·ASP.NET 程序中常用的三十三种代码
·用C语言编通讯录程序(初学者级别的)
·我写的Java学生成绩管理系统源代码
·CHK文件恢复工具
·Modem 常用AT指令集
·java笔试题
·异常java.sql.SQLException: Io exception:The Network Adapter could not establish connection
·单片机模拟I2C总线及24C02(I2C EEPROM)读写实例(源代码)
·C++经典电子书下载
精选专题

[Freelists Internal] 关于Freelists和Freelist Groups的研究

作者: 来源:网络文章 时间:2005-12-17 21:03:39

[Freelists Internal] 关于Freelists和Freelist Groups的研究(1) 1。如果表空间不指定SEGMENT_SPACE_MANAGEMENT AUTO,仍然会使用Freelists和Freelist Groups来管理Free Block。

2。默认的Freelists和Freelist Groups均为1。Dump Segment Header Block可以发现有一个Freelists,称为mater free list,每个segment至少有一个master free list。如:
SEG LST:: flg: USED   lhd: 0x01c0000b ltl: 0x01c0000b
flg(flag)表示该freelist是否被使用
lhd(list header)表示位于该list中的第一个可用block的dba
ltl(list tail)表示位于该list中的最后一个可用block的dba,这个block必定位于HWM之下。
每个位于list中的block header中存在一个指针指向下一个可用的block,如:
fnx: 0x1c0008b

3。如果创建segment时候指定多个freelists,比如设置freelists 2,那么在segment header block中总共有3个free list,其中1个是main free list,另外2个是process free list。如:
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: USED   lhd: 0x01c0008b ltl: 0x01c0008b

4。只有当DML语句使block降到pctused参数指定值之下时,才会动态生成transaction free list记录这些block的dba。而一个新分配的block则始终是位于process free list或者main free list中的。每一个transaction都会动态创建自己的transaction free list,直到达到segment header block size的限制。如:
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000 
SEG LST:: flg: USED   lhd: 0x01c0008d ltl: 0x01c0008d 
XCT LST:: flg: USED   lhd: 0x01c0008c ltl: 0x01c0008a xid: 0x0008.01f.000003d2
可以看到当删除数据使block重新可用的时候,位于freelist header处的是最后被分配的block,最先分配的block则处于freelist tail处。其中xid记录的是这次DML操作的transaction id。
问题:为什么最后被分配的block被放置在freelist header处?

5。当重新insert数据或者发生row  migration的时候,会从transaction free list header开始使用已经释放了的空闲block。如果transaction free list中没有 previously freed blocks,那么就从process free list中寻找,因为可能定义了多个freelist,所以到底从哪个free list中找,算法是(P % NFL) + 1,其中P表示DML操作进程的Process ID,NFL表示Process free lists number。如果在process free list中找不到或者根本就没有process free list(segment只有一个freelist的情况),那么再从main free list中找。仍然找不到的话,返回去再查transaction free list,判断其中的transation是否已经commit,如果已经commit了,则把这个transaction free list的flag标志为unused,同时把位于这个list中的所有block合并到main free list中。

共3页 9 7 [1] [2] [38 :>

[Freelists Internal] 关于Freelists和Freelist Groups的研究 相关文章:
[Freelists Internal] 关于Freelists和Freelist Groups的研究 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com