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%的范围内),那么这个块又回到空闲列表中了,可以再次添加数据。
原文:http://www.relationaldbdesign.com/managing-database-objects/module2/oracle-free-space.php