2.原理探讨
freelist作为一个oracle存储管理的核心参数。其行为方式由oralce内部控制,我们一般不需要掌握和控制。但是我们可能会遇到这些问题,当插入一条记录,会插入到那个块中?是使用新块,还是插入有数据的老块?段是什么时候扩展的,如何扩展的?表中只有一条记录,但是作一次select时代价却是上千个块,为什么?如果我们从原理上清楚了oracle的存储管理方式,对相关这些问题的解决及性能优化就清晰自然了。
2.1 oracle的逻辑储存结构
oralce的逻辑存储结构按表空间,段,区,块进行管理。块是oracle用来管理存储空间的最基本单元,oracle数据库在进行输入输出操作时,都是以块为单位进行逻辑读写操作的。区由一系列连续的块组成,oralce在进行空间分配、回收和管理时是以区为基本单位的。段由多个区组成,这些区可以是连续的也可以是不连续的,一般情况下一个对象拥有一个段。表空间中容纳段和区。
在生成段的时候,会同时分配初始区(initial extents), 初始区的第一个块就格式化为segment header,并被用来记录free list描述信息、extents信息,hwm信息等。
2.2 free list概念
free list是一种单向链表用于定位可以接收数据的块,在字典管理方式的表空间中,oracle使用free list来管理未分配的存储块。oracle记录了有空闲空间的块用于insert或update。空闲空间来源于两种方式:1.段中所有超过hwm的块,这些块已经分配给段了,但是还未被使用。2.段中所有在hwm下的且链入了free list的块,可以被重用。free list具有下列属性