设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 数据库开发 >> 关于Freelists和Freelist Groups的研究(修订版)- 有多少种free list
精品推荐
数据库开发点击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和Freelist Groups的研究(修订版)- 有多少种free list

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

关于Freelists和Freelist Groups的研究(修订版)- 有多少种free list(1)

四.             有多少种free list
1.  master free list或者segment free list
简称为MFL,在segment被创建的时候自动生成的,如果我们在创建segment时没有指定freelists参数,或者指定freelists=1,都是生成这个MFL。MFL对于每个segment来说有且只有一个(如果指定freelists>1,产生的就是不是MFL,这一点将在process free list部分解释)。MFL相当于一个空闲空间池,当一个segment被创建时的初始化block以及以后动态分配的新block都链接到MFL中,这个池中的所有空闲块是被所有进程共享的,对于该segment有insert操作的所有进程都可能会去读取这个free list,这样当有多个进程要同时insert数据时,就可能出现在MFL上的争用(MFL在一个时间只能允许一个进程取得空闲块,当然,其实进程从MFL上读取空闲块的操作并不是简单地需要多少就取多少,取得以后就直接向块中插入数据,实际上的过程要更复杂一些,这个过程在“进程请求空闲块的过程”部分会有详细描述)。由此,推出了freelist groups的概念,设置freelist groups参数大于1就是设置了多个MFL,这样就缓解了对于MFL的争用。有关freelist groups更详细的内容在“Super Master Free list”部分会有描述。
 
2. process free list
如果进程必须直接从MFL中读取空闲块,那么对于MFL的争用由freelist groups参数解决(设置多个MFL),但是显然还有另外一个思路就是尽量不让进程去直接读取MFL,没有需求自然就无所谓争用。由此引入了另外一个级别的free list,这就是process free list,简称为PFL。当我们指定存储参数freelists>1的时候,生成的就是PFL。
我们前面说过MFL是在segment被创建的时候自动生成的,所以无论是不是有PFL,对于每个segment来说都仍然存在1个MFL。也就是如果我们定义freelists等于2的话,那么在segment header block中将总共存在3个freelist,其中1个是MFL,另外2个是PFL。
这一点我们同样可以通过dump转储信息来验证。
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
SEG LST:: flg: USED   lhd: 0x01c0008b ltl: 0x01c0008b
后面两个free list既是PFL,而前面一个则是MFL。
顾名思义,既然命名为process free list,那么显然位于这个级别的free list中的空闲块只能被一个进程读取。想象一下,如果当前系统对于某张表最多同时会有10个进程同时作insert操作,那么我们设置freelists=10,将能尽量满足每个进程都能够使用专属于自己的free list,无疑通过这样的手段我们缓解了free list的争用。
一个进程到底会使用哪个PFL,oracle内部的算法是:(P % NFL) + 1
其中P表示DML操作进程的Process ID,可以从v$process.pid字段中取得。
NFL表示freelists存储参数定义的PFL数量。
可能会有疑问,如果是这样,多个MFL有存在的必要吗?我们只需要设置多个PFL不就可以了吗?然而事实并非如此,不过请稍安毋躁,在后面讲解“进程请求空闲块的过程”中会解释这个问题。
 
3. transaction free list
在Oracle中事务(transaction)是一个重要的概念,每次DML操作,事务的开始都是自动的,而我们可以通过commit或者rollback来标志一个事务的结束。一个进程(或者说一个用户会话)有自己的PFL,然后一个进程可能会执行很多的事务,于是又出现了这个级别的free list,这就是transaction free list,简称为TFL。
TFL是动态产生的,只有当DML语句(比如delete或者update)使block占用量降到pctused参数指定值之下时才会生成TFL,一个TFL只属于一个事务,而一个事务也只会有一个TFL,一个事务没有提交之前,此事务的TFL上的空闲块不会被其它事务使用。但是可以立刻被本事务使用(此时这些空闲块被称为previously freed blocks)。
每个segment最少可以有16个TFL,同时只要有需求就会动态增加TFL数量,除非达到了segment header block size的限制。当没有空间允许新的事务得到自己的TFL时,这个事务就必须等待其它的事务提交并释放TFL。等待哪个事务的算法是:(P % NFL)
其中P表示DML操作进程的Process ID,可以从v$process.pid字段中取得。
NFL表示当前的TFL总数量。
通过dump转储数据块信息,我们可以看到类似于下面的内容:
XCT LST:: flg: USED   lhd: 0x01c0008c ltl: 0x01c0008a xid: 0x0008.01f.000003d2
其中xid表示transaction id,关于transaction id的格式和表示的意义,有兴趣的读者可以查看其它的资料。
 
4. Super Master Free list或者Segment Master Free list
这个级别的free list只有在设置了多个freelist groups时才会出现。
当我们设置freelist group>1,就会产生freelist group block,这些block紧跟在segment header block之后,假设我们设置了storage(freelists 4 freelist groups 2),那么该segment的第一个块是segment header block,第2,3个块则都是freelist group block。
首先在segment header block中存在1个free list,这个free list就被称为Super Master Free list或者Segment Master Free list。
而在每个freelist group block中又都存着1个MFL,还存在4个PFL,每个freelist group block块的剩余空间则全部留给TFL使用。
在单个instance中进程选择freelist group的算法是(P % NFB) + 1 。
其中P表示DML操作进程的Process ID,可以从v$process.pid字段中取得。
NFB表示freelist groups 参数定义的Freelist Groups数量。
而在RAC环境中的算法则更加复杂,本文不作讨论了。
查看freelist group block的转储文件可以看到类似于下面的内容:
frmt: 0x02 chkval: 0x0000 type: 0x16=DATA SEGMENT FREE LIST BLOCK WITH FREE BLOCK COUNT
  blocks in free list = 5 ccnt = 0
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
  SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
  SEG LST:: flg: USED   lhd: 0x01c00116 ltl: 0x01c0011a
SEG LST:: flg: UNUSED lhd: 0x00000000 ltl: 0x00000000
共2页 9 7 [1] [28 :>

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