详解Oracle数据块中的空闲空间


Oracle 是怎样使用数据库里面的空闲空间?

下面是 oracle 中数据块的结构:


数据块是 oracle 存储体系中最小的存储单位,然而你可以设置存储参数来确切的清楚 oracle 是怎么使用数据块中的空闲空间。

 

PCTFREE 参数

当你更新数据库中的一行时, oracle 试着去更新在同一个数据块中的这一行的值。如果你遇到这种情况:你将要更新数据行并且增加他们的大小。在这种情况下,为了使 oracle 不会将此大行添加到其他的位置,你很可能会为这一行增加一个额外的空闲空间。

你可以使用 ptcfree 参数来预留空闲空间, ptcfree 参数描述了为以后添加的数据预留的空间占数据块中的百分比。如果你将 ptcfree 参数设置为 20 ,那么当 oracle 在这个块中添加一新数据行时,块的存储容量仅仅是总存储容量的 80% 。如果添加的新行需要的空间大于存储了数据行的当前块的空闲空间,那么 oracle 会将这个新行移动并存储在下一个数据块中。默认的 ptcfree 参数为 10 ,因此,如果你不为数据库对象(数据块)指定一个 ptcfree 参数的话, oracle 会将添加的新行存储到数据块中,直到存储达到其容量的 90%

 

空闲空间

Oracle 通过空列列表来追踪数据块的可用空间。

每张表都有一个或者多个空闲列表,他们是一个包含了当前范围内可用的数据块的一个列表。如果一个数据块存储达到了它的最大空间容量,它将会从空闲列表中移出。如果一个从数据块(存储达到最大容量)删除了一些数据,使其满足规定的 ptcused 参数的值,那么这个块将会被重放在空闲列表中。

你可以为一张表指定多个空闲列表。如果你经常并发的向表里添加数据,那么你可以拥有多个空闲空间,因为 oracle 会为每一添加到表中的数据行检察这个空闲列表。多张空闲列表能够避免任何潜在的为争夺空闲数据块发生的请求冲突。

 

PTCUSED 参数

一旦达到了 ptcfree 参数的临界值, oracle 就停止为后来添加的数据寻找一个新的数据块。要是数据被删除了,或者清理出了空闲空间,还会向数据块里添加数据吗?

如果从完全使用的数据块删除数据,腾出了一定的空闲空间,那么 ptcused 参数会告诉 oracle 开始向这个块中添加数据。如果你将 ptcused 参数设置为 40 ,一旦删除数据后仅仅腾出了块的可用空间的 39% oracle 又会再次向这个块中添加数据行。

下面这两张图片能够帮助你了解 ptcfree ptcused 参数的相互作用:


说明: 在这个块中,参数 ptcfree 被设置为 20 ptcused 被设置为 40 。这意味着每一块将会预留 20% 的空间,剩下 80% 能存储数据。当块存储数据达到 40% 临界值时,重新启用下一个 40%


说明: 如果这 80% 的空闲空间都存满了数据,就不再向块中添加数据,将块移出空闲列表,如果块中腾出了空闲空间(在 40% 的范围内),那么这个块又回到空闲列表中了,可以再次添加数据。

相关内容