一. 什么是freelists本文在于探讨Freelists和Freelist Groups的作用,存取机制,争用诊断和优化方法,同时通过理论和测试来推翻一些存在了很久的错误观点。本文的读者应该具有较深入的Oracle知识,对于普通的开发人员这篇文章可能并没有太多的协助。我们知道Oracle数据库的读取单位是数据块(Block),而一个Block能否允许被写入数据是基于一定的空闲度,这就是大家知道的pctfree和pctused存储参数设置。假设pctfree=10, pctused=40,这就表明当一个Block的空间使用率达到了90%(100-pctfree)时,这个block就不再允许被用于新增数据(insert),而保留下来的这10%的空间则被预留为行更新(update)所可能需求的空间扩展,我们说此时这个block就从freelist上被摘走了(实际上还有另外一种情况,就是当块剩余空间不足以插入一条记录并且该块的使用率曾经超过了pctused定义的值并且该块位于freelist header处时,该块也会从freelist上被摘走,术语称为UNLINK)。当无数据删除(delete)的时候,只要该block中的数据被删除到一定的程度,该块才会重新被加入到freelists中,而这个程度就是pctused参数定义的数值,如我们这个例子中,只要块中的数据降低到40%以下的时候,该块才被重新允许用于新增数据。通过上面的描述,可以知道所谓freelists,就是一个指定了所有可以用于insert操作的数据块的列表。存在在这个列表中的数据块才能用于insert操作,一旦一个数据块无法用于insert(达到了pctfree参数指定的限制)则立刻从这个列表中被摘除。freelists的作用就在于管理高水位标志(HWM)以下的空闲空间。留意:freelists只是管理高水位标志以下的空闲空间,而实际上一个segment可用的空闲空间包括两品种型:1. 曾经分配给这个segment但是从来未被使用过的位于高水位标志之上的blocks2. 位于高水位标志之下,被链接在freelists上的blocks 至于freelist groups的概念和作用,在下面的章节适当的地方会解释。