1概念理解
首先PCTUSED和PCTFREE都是针对数据块的存储属性,单位都是%。其中PCTFREE决定了数据块什么时候从free list中移除,系统就不可以再往该数据块中插入数据,对于数据块中已有数据的更新可以使用数据块的保留空间(当update数据块时,剩余空间不足于满足update后的空间要求时,将会发生行迁移)。
PCTUSED决定了数据块什么时候被重新放置于free list中去,系统又可以往该块总插入数据(当insert数据到数据块时,剩余空间不满足insert 时的空间要求且重开一个新数据块也不满足时,就发生数据块行链接)。需要注意的是PCTFREE和PCTUSED是两个相互独立的属性,在手动管理的表空间中两个属性都有效,在自动管理的表空间中,PCTUSED已经被废弃,只保留了PCTFREE属性。
举个例子:
假设当前此两属性分别设置为PCTFREE=10,PCTUSED=40,则表示:
ü 当数据块的剩余空间小于10%时,数据块将不再置于free list中,相应的数据块也不会再有新数据插入。
ü 当数据块的已使用空间小于40%时,数据块将重新置于free list中,相应的数据块又可以进行数据的插入。
2环境准备
由于PCTFREE和PCTUSED是两个相互独立的属性,下面我们将分别演示这两个属性的对数据块的影响。
3演示PCTFREE对数据块影响
查看当前TEST表PCTFREE/PCTUSED设置:
从上图中可以看到TEST属于TEST表空间,PCTFREE值为10%,PCTUSED为空说明当前TEST表空间是采用段自动管理的 (ASSM)。
验证表空间的管理方式:
现在我们修改TEST表的PCTFREE和PCTUSED属性(其实修改PCTUSED属性在ASSM管理方式也不会起到效果):
创建一个用于测试的ASSM表空间:
验证新创建的表空间的管理方式:
修改属性后移动TEST表到TEST2表空间:
对表再做一次分析:
查看目前的表属性及数据块的大小:
从上图中可以明显看到目前TEST表属于TEST2的表空间,PCT_FREE参数变成了50,PCT_USED参数为空没有发生改变,数据块占用了增加到了1894个,
TEST表占用的数据块由1050增加到了1894个,这是因为我们更改PCTFREE参数,原来PCTFREE为10%时有90%的空间可以插入数据,而改为50%时只有50%的空间可以插入数据,在数据量没有发生改变的情况下,单个数据块可使用的空间减少了,相应的就需要更多的数据块来存储数据。
4演示PCTUSED对数据块影响
创建一个手工段管理(MSSM)管理的表空间:
验证新创建的表空间:
从上面的图中可以看见新创建的表空间TEST_MSSM的段空间的管理类型是manual。
在手动管理的表空间上创建一张表:
查询TEST1表上PCTFREE\PCTUSED属性设置:
从上图中可以看到默认TEST1表PCT_REE为10,PCT_USED为40,可以发现我们这次PCT_USED有了数值,这是因为TEST1所在的表空间为手动管理的表空间,目前的数据块为1023个。
更改PCTFREE和PCTUSED参数:
再次收集统计信息及查看表属性情况:
从上面的图中可以发现PCT_FREE和PCT_USED参数已经发生了改变,这说明之前我们能的修改已经生效,而数据锁占用的数据块没有发生改变,这说明PCT_USED的变化并不会影响第一次加载的数据。
现在我们要比较PCT_USED参数发生改变时对数据块的影响:
在TEST_MSSM表空间下创建两张一样的测试表:
对表TEST2和TEST3进行分析:
查看TEST2和TEST3表属性信息:
从上面的图中可以看出两张测试表属性信息相同。
修改TEST2和TEST3表的PCTUSED属性,其他比变:
现在再确认一下TEST2和TEST3表属性:
从上图中可以看到我们的更改已经生效,数据块没有发生改变,这是正常的(PCTUSED属性不会影响表第一次插入时分配的block数量)。
分别在TEST1和TEST2表执行删除操作,删除相同部分数据:
分别在TEST1和TEST2表插入相同部分的数据:
执行表分析:
查看两张表属性:
此时发现两张表由于PCT_USED不同,在插入相同数据时,表所占用的数据块数据发生了变化,这是因为再删除了一批数据后,ORACLE会根据所操作数据块的PCTUSED属性来判断数据块是否可以在此被使用,当TEST2表删除后PCTUSED降到30%后才可以往表TEST2中继续插入数据,当TEST3表删除后PCTUSED降到60%后才可以往表TEST3中继续插入数据,由此可见TEST3表数据块的利用率较高,所以存储相同数据的时候它的数据块使用最少。