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

四.             有多少种free list1.  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

时间: 2024-11-01 20:00:44

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

关于Freelists和Freelist Groups的研究(修订版)- freelists是否已经过时

二.             freelists是否已经过时随着Oracle9i的推出,对于空闲块的管理变得更加智能和有效率了.在LMT(Locally Managed Tablespaces)中如果指定了ASSM(Automatic Segment Space Management),那么对于任何pctused,freelists,freelist groups存储参数的指定都将被忽略.创建ASSM表空间的方法如下: CREATE TABLESPACE lmtbsb DATAFILE '/u0

关于Freelists和Freelist Groups的研究(修订版)- freelists存储在哪儿

三.             freelists存储在哪儿freelists存储在每个segment的header block中,我们可以通过dump来得到更清楚的认识.dump在研究oracle的内部机制时通常都扮演着很重要的角色.假设我们创建一个表空间TS_TEST,此表空间是非自动段空间管理的,然后在该表空间中创建T_MANUAL,T_MANUAL_FREE2,T_MANUAL_FREEGROUP2三张表.这三张表的freelists和freelist groups设置如下. SQL> s

关于Freelists和Freelist Groups的研究(修订版)- 什么是freelists

一.             什么是freelists本文在于探讨Freelists和Freelist Groups的作用,存取机制,争用诊断和优化方法,同时通过理论和测试来推翻一些存在了很久的错误观点.本文的读者应该具有较深入的Oracle知识,对于一般的开发人员这篇文章可能并没有太多的帮助.我们知道Oracle数据库的读取单位是数据块(Block),而一个Block是否允许被写入数据是基于一定的空闲度,这就是大家知道的pctfree和pctused存储参数设置.假设pctfree=10, p

FREELISTS and FREELIST GROUPS. SCOPE & APPLICATION

application PURPOSE ======= The purpose of this article is to provide an understanding of FREELISTS and FREELIST GROUPS. SCOPE & APPLICATION =================== This article is intended to be used by DBAs to help understand how FREELISTS and FREELIST

研究发现一种高血压治疗药物可彻底戒除烟瘾

北京时间6月25日消息,据英国<每日邮报>报道,戒烟者往往都有十分痛苦的戒烟经历,香烟可以离手,但是烟瘾却难以消除.不过最新的研究发现,一种高血压和心血管病药物具有消除脑海中和吸烟有关的记忆的功能,从而减轻烟瘾,有助于实现彻底戒烟效果. 实验显示,这种常用于治疗高血压和心血管疾病的β受体阻滞类药物可以作用于某种大脑化学成分,有效地消除和吸烟陋习相关的大脑记忆.正是这些记忆导致烟民喜欢吸烟,使得大量想戒烟的人前功尽弃.据统计,每年英国烟民中的70%试图戒烟,但是只有5%到15%的人能够坚持12个

研究称一种基因可抑制艾滋病病毒复制

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   英国一项最新研究发现,有一种基因可帮助抑制 艾滋病病毒在体内扩散.研究人员 认为,未来有望据此研发出 新的.副作用更小的艾滋病疗法. 英国伦敦大学国王学院等机构的研究人员在新一期<自然>杂志上报告说,他们将可引发艾滋病的Ⅰ型人类免疫缺陷病毒(HIV-1)引入两个不同的人体细胞系中,其中一个细胞系中的MX2基因表达被"开启",即基因

在Silverligh中调用J“.NET研究”avascript (四种调用方法+简单与复杂参数的传递)

在本文我们将一起学习如何在Silverlight后台代码中调用javascritp脚本.Silverlight中内置了对于HTML.客户端脚本等的支持.很多情况下,我们编写的Web应用程序中用了一些JavaScript或者AJAX框架,我们可以在Silverlight调用某些脚本方法,或者说在Silverlight中触发某个脚本的执行. 本文将示例如何调用Silverlight脚本, 要使用此功能,我们需要引入命名空间: using System.Windows.Browser; //引入此命名

Oracle Freelist和HWM原理探讨及相关性能优化

oracle|性能|优化 Oracle Freelist和HWM原理探讨及相关性能优化 中兴通讯重庆研究所 游波   关键词:Freelist,HWM,存储参数,段,块,dump,优化 文章摘要:    近期来,FreeList的重要作用逐渐为Oracle DBA所认识,网上也出现一些相关的讨论.本文以FreeList为线索对Oracle的存储管理的原理进行较深入的探讨,涉及Oracle段区块管理的原理,FreeList算法等.而与FreeList密切相关的一个重用特性HWM,与sql性能密切相

ORACLE--逻辑架构(二)

上一文中对ORACLE逻辑架构的基本体系做了说明,这部分是专门对SEGMENT部分进行说明,因为段才是管理对象的关键点,也是管理对象的基本,本文主要写   1.TABLE SEGMENT 2.INDEX SEGMENT 3.UNDO SEGMENT 4.LOBSEGMENT.LOB PARTITION.LOBINDEX.INDEX PARTITION 下面切入正题: 1.TABLE SEGMENT: TABLE的分类大致有: a.常规的堆表(HEAP表) b.索引组织表,带有主键组织的表,主键自