block学习(pctfree&pctused),行迁移问题(zt)

说到block大家都应该知道,block是最小的存储单位

Oracle让你选择的block size包括2K, 4K, 8K, 16K, 32K,那么我们应该如何选择block size呢?
对于block size的选择完全取决于应用模式。如果应用中以较小的随机读取为主,选择比较小的block size就比较有利。如果应用以大量的连续读写为主,则一般倾向于是用大的block size。所以我们经常会看到在OLTP的系统中选用4k~8K的block size, 而在DW里面多采用16K或更大的block size。另外我们总是希望表的一行可以尽量存储在一个block里,这有时也可以成为一个考虑的理由。


ITL:Interested Transaction List,这部分影响block的concurrency能力, ITL实际就是放在block header的一段数据,称为ITL slot。每个slot都是这个block上的transaction的入口,也就是说,如果这个block上有10个ITL slot,那么在这个block在同一时刻最多允许的transaction数量是10。

ITL的个数由存储参数inittrans和maxtrans,一般在create table (index)时设置, 相信你已经猜到了, inittrans就在一个初始的block上的slot个数, maxtrans则是这个block上最大的slot个数,默认设置( inittrans =1, maxtrans =255)基本上对大多数情况都是适用的。由于ITL slot本身占用空间并且需要管理,所以盲目增大inittrans并不可取,默认的maxtrans =255已经很大了,很少有应用会在同一时刻在单个block上产生255个事务。

一般来说,默认的ITL的设置是比较合理的,但是不要忘记,在Oracle里面没有万能的设置,在我们case里的默认的inittrans =1, maxtrans =255是有问题的

到此为止,在这一章我们了解了2个影响concurrency的item(东东):ITL和free list,希望大家不会把他们搞混。(所谓concurrency,就是你可以在同一时间同一地点做同一件事的能力)ITL和free list的区别包括:
1. 影响的地点不同:ITL影响在block层面上的concurrency,free list影响在segment层面上的concurrency
2. 影响的事情不同:ITL影响的是并发的事务,而free list影响的是并发的insert。
3. 影响的时间不同:一个block上的事务是在整个事务期间占用一个ITL slot,当事务结束后释放。而一个insert只是在insert之前寻找free block的时候占用free list,找到了之后就不占用了。占用的时间相对ITL来说是很短的。其实就好像我们去看电影一样,首先去买票,这就好像在电影院里找free的位置,尽管买票的动作一般很快,如果同时很多人买票的话,电影院最好多开几个售票点。当我们进入影院,做到位置上,我们在整个看电影的过程都占着这个位置。这里面售票点就像free list,里面的位置就像ITL slot。


现在我们知道了free list是为insert提供一个可用的free block列表,问题是怎样的block算是’free’的呢------也就是说,Oracle根据什么标准来判断block是否free enough并借此维护free list。

我们是通过在create segment (create table/index) 时候指定pctfree和pctused这两个存储参数,我们设立这个标准。Pctused是用来把block放到free list上面去,pctfree是用来把block从free list拿下来。按照这两个参数的默认设置pctused=40, pctfree=10,当一个block的使用率降到39%,这个block会被放到free list上,接受insert,随着block里数据的增加,当使用率升到高于90% (free space < 10%),这个block将会从free list拿下来。这时候这个block不允许新的insert,只允许update和delete。相信大家知道:insert 提高使用率,delete降低使用率,而update则既可能提高也可能降低。Pctused和pctfree不能设置的太接近,比如pctused =89,pctfree=10,这种情况下segment里的block就会不停的加入free list,再马上从free list拿下来,这会导致free list上的争用很严重。

对于free list和free list group的设置,如果设置太小,在高度并发insert的时候free list上会产生争用,设置的太大会导致空间的浪费和额外的管理开销,所以如何设置首先是充分理解,然后就是监控,调整,监控,调整的过程。

假设pctfree=10, pctused=40,这就表明当一个Block的空间使用率达到了90%(100-pctfree)时,这个block就不再允许被用于新增数据(insert),而保留下来的这10%的空间则被预留为行更新(update)所可能需要的空间扩展,我们说此时这个block就从freelist上被摘走了(实际上还有另外一种情况,就是当块剩余空间不足以插入一条记录并且该块的使用率已经超过了pctused定义的值并且该块位于freelist header处时,该块也会从freelist上被摘走,术语称为UNLINK)。当有数据删除(delete)的时候,只有该block中的数据被删除到一定的程度,该块才会重新被加入到freelists中,而这个程度就是pctused参数定义的数值,如我们这个例子中,只有块中的数据降低到40%以下的时候,该块才被重新允许用于新增数据。通过上面的描述,可以知道所谓freelists,就是一个指定了所有可以用于insert操作的数据块的列表。存在在这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了pctfree参数指定的限度)则立刻从这个列表中被摘除。freelists的作用就在于管理高水位标志(HWM)以下的空闲空间。
注意:freelists只是管理高水位标志以下的空闲空间,而实际上一个segment可用的空闲空间包括两种类型:
1. 已经分配给这个segment但是从来未被使用过的位于高水位标志之上的blocks
2. 位于高水位标志之下,被链接在freelists上的blocks

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-85145/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-85145/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值