请教两个问题1 什么是pctXXX?比如 pctincrese, pctfree?2 什么是快照太旧?使快照太旧的原因?

解决方案 »

  1.   

    一 般而言,PCTFREE参数用来告诉Oracle应该在块上保留多少空间来完成将来的更新。默认情况下,这个值是10%。如果自由空间的百分比高于 PCTFREE中的指定值,这个块就认为是“自由的”。PCTUSED则告诉Oracle当前不“自由”的一个块上自由空间百分比需要达到多大才能使它再 次变为自由的。默认值是40%1。
    如 前所述,对于一个表(而不是一个IOT,有关内容稍后再介绍),PCTFREE会告诉Oracle:块上应该保留多大的空间来完成将来的更新。这说明,如 果我们使用的块大小为8KB,只要向块中增加一个新行,就会导致块上的自由空间下降大约800字节,Oracle会使用FREELIST的另一个块,而不 是现有的块。块上这10%的数据空间会预留出来,以便更新该块上的行。
    1. 实际上PCTUSED的含义是,如果块上不自由的空间到达或小于PCTUSED参数指定的百分比时,这个块将重新变为自由,如倘若PCTUSED为40%,那么块上不自由的空间小于40%时,即自由空间达到60%时,这个块就重新变为自由。——译者注。
    注意 对 于不同的表类型,PCTFREE和PCTUSED的实现有所不同。对于某些表类型,这两个参数都要使用,而另外一些表类型只使用PCTFREE,而且对于 这些表类型,仅当创建对象时才会使用PCTFREE。IOT在创建时可以使用PCTFREE在表中预览空间来完成将来的更新,但是在其他方面并不使用 PCTFREE,例如,PCTFREE不用于决定何时停止向一个给定块中插入行。
    根 据你使用的是ASSM表空间还是MSSM表空间,这两个参数的实际作用会有所不同。使用MSSM时,这些参数设置控制着块何时放入freelist中,以 及何时从freelist中取出。如果使用默认值:PCTFREE为10,PCTUSED为40,那么在块到达90%满之前(有10%以上的自由空间), 这个块会一直在freelist上。一旦到底90%,就会从freelist中取出,而且直到块上的自由空间超过了块的60%时,才会重新回到 freelist上,在此之前,这个块一直不在freelist上。
    使用ASSM时,PCTFREE仍然会限制能否将一个新行插入到一个块中,但是它不会控制一个块是否在freelist上,因为ASSM根本不使用freelist。在ASSM中,PCTUSED将被忽略。
    PCTFREE有3 种设置:太高、太低好刚好。如果把块的PCTFREE设置得过高,就会浪费空间。如果把PCTFREE设置为50%,而你从未更新数据,那么每个块都会浪 费50%的空间。不过,在另一个表上,50%可能非常合理。如果行初始很小,现在想将行的大小加倍,但是倘若PCTFREE设置得太小,更新行时就会导致 行迁移。
      

  2.   

    《Oracle 9i 10g编程艺术:深入数据库体系结构〉〉
    第10章
      

  3.   

    我说一下我对快照太旧的理解, 不对的话一起讨论:例如修改了某个数据块上,时间1,2,3时值分别是A,B,C, 但是没有提交那么3时表上的块值是3, 而因为没有提交的原因,
    A,B仍存在数据库的回退段中, 基于scn号1和2如果一个长sql, 时间1时开始执行, 那么它的查询结果应基于时间1
    但它到了3时仍没有执行完因为太多的更新没有提交, 回退段的东西太多了, 所以较早的1时的A出了回退段, 它不在数据库里了现在这个sql基于scn号去找值A, A不在了,就会报快照太旧
    解决的办法是增大回退段和分段提交
     
      

  4.   


    自由范围的碎片整理  表空间中的一个自由范围是表空间中相连自由(空间)块的集合。当一个段关闭时,它的范围将被释放,并被标记为自由范围。然而,这些自由范围再也不能与相邻的自由范围合并,它们之间的界线始终存在。但是当表空间的缺省值pctincrease设置不为0时,SMON后台进会定期的将这些相邻的自由范围合并。若pctincrease设置为0,那相邻自由范围不会被数据库自动合并。但可以使用 alter tablespace 命令coalesce选项,来强迫进行相邻自由范围的合并。  不进行自由范围合并,在日后的空间请求中,会影响到表空间中的空间分配。当需要一个足够大的范围时,数据库并不会合并相邻的自由范围,除非没有其他选择。这样,当表空间中前面较小自由范围已被相关使用时,将使用表空间中后面部分最大的一个自由范围。结果,会因为它们没有足够多的使用空间,从而导致表空间中速度上的矛盾。由于这样的进程出现,使数据库的空间分配距理想越来越远。自由空间碎片常会出现在那些经常关闭又重新生成的数据库表和索引中。在理想的ORACLE表空间中,每一个数据库对象存储在一个单独的范围中,并且所有有效自由空间集中在一个巨大而连续的范围中。这样,在一个对象需要附加存储空间时,可以在增加获取足够大自由空间的可能性同时,最小化空间中的循环调用,提高自由空间使用率