Oracle pctfree和pctused详解

        pctfree 这个参数定义了一个块保留空间的百分比,保留空间是为了将来可能发生的更新操作,因为更新可能增大被更新行占用的空间,如果此时该块没有可利用空间,那么只有发生row migrate了,从而会降低I/O性能。换句话说,就是当一个块的利用率达到1-pctfree的时候,oracle就将该块从freelist中移除,不再向该块插入数据。所以说pctfree是控制什么时候将块从freelist中移除的。
     pctused 这个参数控制一个块什么时候被重新启用来插入数据,例如当一个块达到1-pctfree利用率的时候,oracle停止向该块插入数据,同时从freelist移除该块,但是后来发生一些删除操作,使得该块的利用率下降,当该块的利用率降到pctused以下的时候该块就被重新启用来插入数据了,也即是将该块重新加入到freelist列表中,所以说pctused是控制什么时候将一个块重新加入freelist的。
    举个例子:比如一个块的pctfree定为10%,pctused定为40%(oracle默认设置)。那么一个块的使用率达到90%(即1-10%)的时候,oracle将该块从freelist中移除,停止使用该块来插入数据(但可更新)。后来该块上发生了一些删除操作,使得该块的利用率下降,当使用率下降到40%以下的时候,oracle重新将该块加入freelist,可用于新的插入。

注意:
    PCTFREE PCTUSED 的值可以在创建表时指定,也可以在创建表后用修改,但是要注意的是,修改后的值,只对修改后的数据操作有影响,对之前的无效。 因为 OLTP 系统对数据块的 DML 操作会较为频繁,所以在 OLTP 系统中正确配置这两个属性可能会对性能有一定的提高。
    在Oracle11g中,表空间默认使用本地位图自动管理PCTFREE的默认值是10,且无法自定义管理PCTUSED属性,除非将表空间设置为手动管理。

    下面是一个比较形象的比喻,大家可以参考:
    把BLOCK 想成一個水杯。侍者把水倒入放在我們面前的水杯,要多滿呢,我們要求他倒 9 分滿好了,這時候 PCTFREE 代表著設定為 10 ,意思就是說,當 BLOCK 使用到達 90% 的時候,就不可以在使用了,這個 BLOCK 應該從 FREELIST 列表中移除 (un-link) 。為何要保留 10% 的空間呢?這是為了提供 update 資料時所可能增加的空間使用,如果空間保留的太小,就容易發生 row chaining 。

PCTUSED 代表著這杯水什麼時候可以添加,假設 PCTUSED 為 40 ,代表當我們把水杯的水喝到剩下 40% 以下時,侍者就會知道需要加水了。你想想看,如果說在餐廳裡妳每喝一口水侍者就來加水,你會不會覺得很煩,對餐廳來說,也要派很多人不斷幫每桌客人加水,這生意還能做嗎?所以說, PCTUSED 代表著 re-link 回 FREELIST 的意義,如果說 PCTUSED 設的太大,例如 70 好了,代表這杯水你隨便喝一口侍者就要來加水了,這隱含的意義是,這個杯子的利用率增加,但是侍者頻繁的服務造成了負荷 (I/O Overhead) 。 PCTUSED 設小一點,例如 10 ,代表當水喝到剩下 10% 的時候 ( 如同 DELETE 事務操作 ) ,才須要放回 FREELIST ,代表可以加水了 ( 如同 INSERT 事務操作 ) 。

簡單的說,如果希望儲存空間發揮最大使用效益,可以把PCTUSED設大一點,相反的,如果想要提高IO效能,應該把PCTUSED設定小一點。


 


一、建立表时候,注意PCTFREE参数的作用

      PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update;即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期。

      PCTUSED:是指当块里的数据低于多少百分比时,又可以重新被insert,一般默认是40,即40%,即:当数据低于40%时,又可以写入新的数据,这个时候处在下降期。

 

二、举例说明

      假设你一个块可以存放100个数据,而且PCTFREE 是10,PCTUSED是40,则:不断的向块中插入数据,如果当存放到90个时,就不能存放新的数据,这是受pctfree来控制,预留的空间是给UPDATE用的。

      当你删除一个数据后,再想插入个新数据行不行?不行,必须是删除41个,即低于40个以后才能插入新的数据的,这是受pctused来控制的。

      注意:如果表空间上启用了ASSM,在建立表的时候,只能指定PCTFREE,否则可用指定PCTFREE和PCTUSED。

             

 

三、调整pctfree与pctused
1、通过user_tables的pct_free,pct_used来查看
select a.table_name, a.pct_free, a.pct_used, a.* from user_tables a; 
说明:
pctfree表示用于保留更新操作的百分比,如果超过该值不能插入数据。
pctused表示数据所占最低百分比,如果达到pctfree时不能插入,delete后如果达到pctused才可以用来insert

 

2、如果你使用的是自动管理表空间pctused不需要设置,请参照下面的※延伸阅读
altertable tablename pctfree values;
说明:
pctfree默认是10,主要看更新的数据有多大,可以查看表的max_row_len如果很大又频繁更新可以考虑增加该值。
pctused主要看删除数据的大小,如果很大可以调大该值,如果不是很频繁可以设置小一些30-40
pctused+pctfree<90

 

3、查看自动管理表空间
select tablespace_name,segment_space_management from user_tablespaces; --segment_space_management为auto表示自动管理表空间
主要起到节省表空间的作用。


※延伸阅读

本地管理tablespace(LMT)——LMT是通过把EXTENT MANAGEMENT LOCAL子句添加到tablespace的定义句法而实现的。和原来由字典管理的tablespace(DMT)不同,LMT会将扩展管理自动化,并保持Oracle DBA不会被用来指定管理扩展大小的NEXT存储参数。这个原则唯一的例外是在NEXT和MINEXTENTS一起用在表格创建的时候。
自动段空间管理(ASSM)   ——ASSM的tablespace是通过将SEGMENT SPACE MANAGEMENT AUTO子句添加到tablespace的定义句法里而实现的。通过使用位图freelist取代传统单向的链接列表freelist,ASSM的tablespace会将freelist的管理自动化,并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。

自动段空间管理(ASSM)

920以前,表的剩余空间的管理与分配都是由连接列表freelist来完成的,因为freelist存在串行的问题,因此容易引起段头的争用与空间的浪费(其实这一点并不明显),最主要的还是因为需要DBA花费大量的精力去管理这些争用并监控表的空间利用。

自动段空间管理(ASSM),它首次出现在Oracle920里。有了ASSM,连接列表freelist被位图所取代,它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed SegmentsBMB段)

Create tablespaceleonarding
datafile '/ora01/oem/
leonarding01.dbf '
size 10m
EXTENT MANAGEMENT LOCAL-- Turn on LMT
SEGMENT SPACE MANAGEMENT AUTO-- Turn on ASSM;

一旦你定义好了tablespace,那么表和索引就能够使用各种方法很容易地被移动到新的tablespace里,带有ASSM的本地管理tablespace会略掉任何为PCTUSEDNEXTFREELISTS所指定的值

当表格或者索引被分配到这个tablespace以后,用于独立对象的PCTUSED的值会被忽略,而Oracle9i会使用位图数组来自动地管理tablespace里表格和索引的freelist。对于在LMTtablespace内部创建的表格和索引而言,这个NEXT扩展子句是过时的,因为由本地管理的tablespace会管理它们。但是,INITIAL参数仍然是需要的,因为Oracle不可能提前知道初始表格加载的大小。对于ASSM而言,INITIAL最小的值是三个块。

使用ASSM的一个巨大优势是,位图freelist肯定能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题。

缓冲区不再忙等待
  在没有多个freelist的时候,每个Oracle表格和索引在表格的头部都曾有一个数据块,用来管理对象所使用的剩余区块,并为任何SQL插入声明所创建的新数据行提供数据块。当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候,缓冲区忙等待就会发生。当你需要将多个任务插入到同一个表格里的时候,这些任务就被强制等待,而同时Oracle会在同时分派剩余的区块,一次一个。
  有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为(同一个)位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作
   ASSM 的局限性
  尽管 ASSM 显示出了令人激动的特性并能够简化 Oracle DBA 的工作,但是 Oracle9i 的位图分段管理还是有一些局限性的:
  
   1. 一旦 DBA 被分配之后,它就无法控制 tablespace 内部的独立表格和索引的存储行为。
   2. 大型对象不能够使用 ASSM ,而且必须为包含有 LOB 数据类型的表格创建分离的 tablespace
   3. 你不能够使用 ASSM 创建临时的 tablespace 。这是由排序时临时分段的短暂特性所决定的。
   4. 只有本地管理的 tablespace 才能够使用位图分段管理。
   5. 使用超高容量的 DML (例如 INSERT UPDATE DELETE 等)的时候可能会出现性能上的问题。

你可能感兴趣的:(Oracle)