高水标记:如果将一张表想象成水平结构,一系列的块都是从左向右排列,成一条直线放置,高水标记(high water mark)就是曾经包含数据的最右边的块。随着数据不断地放入表中,使用了更多的块,从而高水标记不断上升,如果删除了一些表中的行,有许多块可能不再包含数据,但是这些块仍然在高水标记以下,并且保持在高水标记以下直到对象被重建或删减。在全扫描期间,Oracle将扫描高水标记以下的所有块,即使它们不包含数据,这将影响全扫描的性能,尤其高水标记以下的大部分块都是空时。truncate将重新设置表的高水标记,让它返回0,而0delete表中所有行时高水标记不会改表。如果计划删除表中的每一行时,使用truncate方法比较合适。
自由列表(FreeList):用来跟踪高水标记以下有空闲空间的块对象,每一个对象至少有一个FreeList和它相关,当块被使用时,Oracle将根据需要放置或取走FreeList,只有一个对象在高水标记以下的块才能在FreeList上发现,一个对象可能不止有一个FreeList,如果预料会有许多并行用户对一个对象进行大量对的插入和更新操作,配置多个FreeList能提高整体性能,拥有足够的FreeList供使用是很关键的,能极大提高性能,其代价是增加存储空间。在创建表的时候可以指定FreeList的个数,或者后来更改其个数。create table table1 (id integer) storage (freelist 20).更改时:alter table table1 storage(freelist 20).需要注意的是:Cannot alter freelist storage parameter for segments in tablespaces with AUTO SEGMENT SPACE MANAGEMENT,否则会抛出ORA-10620: Operation not allowed on this segment
Cause: Cannot alter freelist storage parameter for segments in tablespaces with AUTO SEGMENT SPACE MANAGEMENT
Action: Recheck the segment name and re-issue the statement 。在把freeList由高值改为较小的值时,空间将被较小,快有现有的多个FreeList将合并成一个主FreeList。
PCTFREE &. PCTUSED 这两个设置用来控制何时增加和撤销FreeList。pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。
行连接:指一行存储在多个块中的情况,这是因为该行的长度超过了一个块的可用空间大小,即行链接是跨越多块的行。
行迁移:指一个数据行不适合放入当前块而被重新定位到另一个块(那里有充足的空间)中,但在原始块中保留一个指针的情形。原始块中的指针是必需的,因为索引的ROWID项仍然指向原始位置。
要形容一个 BLOCK 的运作,可以把一个 BLOCK 想成一个水杯。waiter把水倒入放在我们面前的水杯,要多滿呢,可以要求他倒 9 分滿好了,这时 PCTFREE 代表着设定为10 ,意思就是说,当 BLOCK 使用到达 90% 的时候,就不可以再使用了,这个 BLOCK 应该从 FREELIST 列表中移除 (un-link) 。保留 10% 的空间是为了提供 0update 时所可能增加的空间使用,如果空间保留的太小,就容易发生 row chaining 。 PCTUSED 代表着這杯水什么时候可以添加,假设 PCTUSED 为 40 ,代表当我们把水杯的水喝到剩下 40% 以下時,waiter就会知道需要加水了。你想想看,如果说在餐厅里你每喝一口水waiter就來加水,你会不会觉得很烦,对餐厅来说,也要派很多人不断帮每桌客人加水,所以说, PCTUSED 代表着 re-link 回 FREELIST 的意义,如果说 PCTUSED 设的太大,例如 70 好了,代表这杯水你随便喝一口waiter就要来加水了,這隐含的意义是,這个杯子的利用率增加,但是waiter频繁的服务造成了负荷 (I/O Overhead) 。 PCTUSED 设小一点,例如 10 ,代表当水喝到剩下 10% 的时候 ( 如同 DELETE事务操作 ) ,才需要放回 FREELIST ,代表可以加水了 ( 如同 INSERT 事务操作 ) 。如果希望存储空间发挥最大使用效益,可以把PCTUSED设大一点,相反的,如果想要提高IO效能,应该把PCTUSED设定小一点。在OCP文档上那张图,一目了然,当使用一个block时,在达到pctfree之前,该block是一直可以被插入的这个时候处在上升沿,pctused在下降沿起作用。
关于pctfree设置,ocp教材上有建议,可以参考:PCTFREE缺省为 10,如果没有 UPDATE 活动,为0
pctused和pctFree和freelist是很关键的,一方面,避免许多行的迁移,另一方面,避免浪费太多空间,1、高PCTFREE,低PCTUSED,用于插入许多将要更新的数据,并且更新经常会增加行的大小,这样插入后在块上保留了许多空间(高PCTFREE),在块返回到自由列表之前,块必须机会是空的(低PCTUSED);2、低PCTFREE,高PCTUSED,用于倾向于对表只使用INSERT和DELETE,或者如果要UPDATE,UPDATE也只是会使行变小。
INITIAL,NEXT,PCTINCREASE这些都是存储参数,设定盘区的大小。定义INITIAL的大小,分配给表的随后的盘区,以及NEXT盘区应该增加的百分比,数据库应该使用局部管理并且盘区大小一致的表空间,INITIAL盘区总是等于NEXT盘区的大小,并且不必使用PCTINCREASE,使用这个参数只会导致表空间产生碎片。在没有使用局部管理表空间的情况下,建议总是设置INITIAL=NEXT 和PCTINCREASE等于0。
MINEXTENTS和MAXEXTENTS控制对象对它自己分配的盘区数,设定min告诉oracle最初分配给表多少盘区,如在局部管理表空间中使用一致的盘区大小为1M,minExtents设为10,会使表得到10M的存储空间。
INITRANS和MAXTRANS。对象中的每一个块都有一个块头,块头的一部分是事务表,事务表中的条目描述哪一个事务块上的行或元素被锁定了,事务块的最初大小由INITRANS设置,默认2,当需要时,事务表可以动态增加,大小最多到MAXTRANS(家丁块上有足够的空闲空间),每一个分配的事务条目在块头上占用23字节的存储空间。
相关文章
Oracleto_char()函数的使用方法
Oracle连接远程数据库并远程执行DDL操作
Oracle中Decode()函数的使用方法
Oracle的随机数、随机日期和时间、随机字符串
Oracle中一些基础参数的设置
Oraclesequence的order_noorder选项
oracle删除,修改主健_外键代码
Oracle频繁归档问题解决办法
oracle数据库命令行导入导出方法
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛