pctfree+pctused=100时,block会不断地被设置为可用,不可用这种情况oracle怎么处理阿假设我必须要设置成pctfree+pctused=100

解决方案 »

  1.   

    pctfree+pctused=100时,block会不断地被设置为可用,不可用
    貌似不会出现你说的情况啊
      

  2.   

    oracle不是一个块在那里不停的折腾
      

  3.   

    pctfree+pctused=100 是可以的,也不会出现“不断地被设置为可用,不可用”。
    因为 pctfree 是针对 insert 操作的,而 pctused 是针对 delete 和 update 操作的。当一 block 在 insert 后达到 pctfree 限定后,会被移出 freelist;在此 block 上执行 delete 或 update 操作后,如果此 block 达到 pctused 限定后,此 block 才会被移入 freelist。但是,pctfree+pctused=100 会导致性能问题。当多个会话并发修改表时,pctfree+pctused=100 会增加 buffer busy waits 的风险。
      

  4.   

    比如pctfree=10,pctused=90当插入一条数据后block达到90%时,block被移出freelist然后再delete一条数据,这时block小于pctused(90%),block移入freelist
    这样不断循环,oracle会怎么处理呢
      

  5.   

    额,还真是,ptfree是保留的空间,ptused是可以重用的判断刻度,两个相加等于100也就是中间的insert可用空间被你给压缩没了,
    为什么一定要设为100呢
      

  6.   

    另外问一下你使用的oracle版本?
      

  7.   


    就是这样,insert 和 delete 也可以正常动作。
      

  8.   

    问题的关键在于多会话并发操作表时,oracle 反复的将一个数据块放入/移出 freelist,会阻止其他会话读取此数据块在数据缓冲区的镜像(其上会加 latch),从而导致性能问题。因此建议 pctfree+pctused<100。
      

  9.   

    仔细看了一下相关资料。
    实际上,在一个会话使用 dml 语句操作数据块时,如果此数据块达到 pctused 限定,此数据块将会被放入 transaction freelist,而非段的 process freelist。transaction freelist 是在事务执行时动态生成的,当事务需要可用的 block 时会首先从 transaction freelist 获取 block。
      

  10.   


    什么意思啊,不太明白pctfree+pctused=100是故意这样设置的,就是想知道这种情况下,oracle怎么处理,有什么机制防止它不停的将block放进放出么oracle 用的10g
      

  11.   

    如果 pctfree+pctused=100 ,或者 pctfree 与 pctused 间的差值太小,oracle 本身没有什么办法阻止数据块频繁的进出 freelist。所以,设计表时应该注意不要让 pctfree+pctused=100,或者 pctfree 与 pctused 间的差值太小。其影响主要在于,在多会话同时修改表时可能会导致性能下降。
      

  12.   

    10g ptused貌似设置了跟没设置一样。
    不太确认了,明天查文档看看
      

  13.   

    10g 里面不用pctused了。
    pctused的值是给update留的。
    pctfree的值是 当块中使用空间小于这个值时会被放入到freelist中。
    一定是pctfree+pctused<=100。若真的等于100也没有问题。
      

  14.   

    使用自动段空间管理(ASSM),确实不需要设置 PCTUSED,而只需要设置 PCTFREE。而使用手动段空间管理(MSSM),是需要设置 PCTUSED 的。而 ORACLE 10g 的表空间默认是 ASSM 的,但可以显示定义为 MSSM (CREATE TABLESPACE ... SEGMENT SPACE MANAGEMENT AUTO|MANUAL) 。