PCTFREE 指数据块中保留的空间以便更新现有的行。所以对于update造成的行变长而言更大的PCTFREE是更亲和的,更少造成migrated rows的。这个参数是一个百分比,代表块大小的百分比。
在块中剩余空间达到PCTFREE指定的百分比之前,这些空闲空间可以被插入行数据和block header的增长、以及UPDATE造成的行变长等等操作所用。 换而言之当剩余空间等于或者小于PCTFREE时,这些空闲空间不会再为插入所用了,而只是给block header的增长、以及UPDATE造成的行变长等等操作所用。注意在ASSM下 当剩余空间等于或者小于PCTFREE时 数据块就被 bitmap block标记为 FULL了,而不是真的”FULL”了。
PCTUSED参数(ASSM Automatic Segment Space Management下被废弃,仅仅MSSM下具有效果) 决定数据块在达到PCTFREE而被标记为FULL后,当数据块中被使用的比例下降到比PCTUSED(其实也是百分比)更小时,这个数据块被认为又可用来插入新的行数据了,这是PCTUSED的作用。
由于当数据被插入到数据块中时,行数据时从块的底部往上存储的。 而块头block header所占的空间又是浮动的,这是由于interested transaction lists (ITLs)也是要占用空间的,而一个块中ITL的数量是变化的,这种空间使用时从块的头部往下扩展的。 设置一个较大的INITRANS初始ITL数据将为块头保留更多的空间,这是因为一开始就会创建空的ITL(对于已有的块要MOVE才生效),但空的ITL已经占了地方了,所以别人就占不走了, 但是这样也会造成每个块中可用的空间减少。 DBA需要自行在 并发需要和可用空间上权衡利弊。
From askmac.cn
需要注意 , 这2个参数在MSSM和ASSM 数据段管理方式下的不同。
在MSSM freelist-managed模式下,当PCTFREE指定的值被达到后,由于该块会从Freelist上被移除所以不会有新的数据被插入到该块中。 但余下来的所有空间均只能用来更新现有的行。 DELETE删除显然会释放块上的空间,当DELETE和UPDATE(指让行缩小的UPDATE)营造出更多的空闲空间,以致于被使用的空间已经小于PCTUSED了,那么此时这个数据块又会被放到FREELIST上,这之后用户又可以插入数据到该块中。
还需要注意,PCTUSED在ASSM段上是不生效的。