日期:2014-05-17  浏览次数:20705 次

索引的pctfree疑问
为什么当要在表上执行大量insert语句时,建立的索引,要设置较大的pctfree?最好解释的详细点

------解决方案--------------------
跟表段的pctfree不同,索引段的pctfree是创建索引的时候才起作用的,而且只是用来保证insert的时候不出现索引块分裂的现象,索引创建好之后,pctfree参数是无效的。
------解决方案--------------------
引用:
为什么当要在表上执行大量insert语句时,建立的索引,要设置较大的pctfree?最好解释的详细点


最好先理解pctfree的意义。PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数据块的可用空间低于10%后,就不可以被insert了,只能被用于update;即:当使用一个block时,在达到pctfree之前,该block是一直可以被插入的,这个时候处在上升期。假设你一个块可以存放100个数据,而且PCTFREE 是10,PCTUSED是40,则:不断的向块中插入数据,如果当存放到90个时,就不能存放新的数据,这是受pctfree来控制,预留的空间是给UPDATE用的。

所以,实际上PCTFREE就是用来控制你的块的保留空间,PCTFREE越大,块保留的空间越多。为什么要保留空间呢?就是为了防止UPDATE,因为数据类型的长度可以调整,比如从varchar2(20)调整到varchar2(50),那么多出来的空间如果不设置pctfree的话,就会导致块分裂和行迁移,影响表查询性能。所以在表上执行大量insert语句时,建立的索引,并不一定要设置较大的pctfree。但是如果你确定你可能需要增加索引列的字段类型长度的时候,最好设置合适的pctfree,一般情况下都是采用默认即可。