
4.7 表参数以及参数维护
Heap Table 就是一般的表,获取表中的数据是按命中率来得到的。没有明确的先后之分,在进行全表扫描的时候,并不是先插入的数据就先获取。数据的存放也是随机的,当然根据可用空闲的空间来决定。 IOT 就类似是一个全是索引的表,表中的所有字段都放在索引上,所以就等于约定了数据存放的时候是按照严格规定的,在数据插入以前其实就已经确定了其位置,所以不管插入的先后顺序,它在哪个物理位置与插入的先后顺序无关。这样在进行查询的时候就可以少访问很多blocks,但是插入的时候,速度就比普通的表要慢一些。
在创建表时,我们使用了表空间和storage参数,如initial、next、pctincrease等,而在数据库的维护过程中,这些参数是不允许变化的,但是Oracle为了管理和控制数据块,引入了4个参数,当使用手工管理进行段空间管理时,需要设置这几个参数。下面分别说明主要的3个参数。
1.INTRANS
该参数是控制对数据块并行操作的参数,在解释该参数前,先介绍事务槽的概念,事务槽在数据块头中,存储了有关事务的控制信息,而每行数据有一个锁位,该锁位号和事务槽号相同,数据库服务器就是通过每行的锁位找到数据块头中的事务槽,利用存储在该事务槽中的事务信息完成对该行数据的操作。每个事务只使用一个事务槽。锁位和事务槽的关系以及数据块的组成如图4-2所示。

图4-2 数据块结构及事务槽与锁位关系图
INITRANS定义了创建数据块时事务槽的初始值,该参数的默认值为1,如该参数为2,说明数据库服务器实现在一个数据块中可以有最多2个并行的事务,每个事务独立地并行通过自己的事务槽还实现对该行数据的事务操作。
2.MAXTRANS
该参数定义了创建数据块时事务槽的最大值,默认值为255。下面我们通过例子4-12来查看SCOTT用户的表EMPLOYEES的表参数INITRANS和MAXTRANS参数。
例子4-12 查看SCOTT用户的表EMPLOYEES的表参数INITRANS和MAXTRANS参数
SQL> select ini_trans,max_trans 2 from dba_TABLEs 3 where owner = 'SCOTT' 4 and TABLE_name = 'EMPLOYEES'; INI_TRANS MAX_TRANS -------------------- ------------------ 1 255
输出说明,表EMPLOYEES的两个参数INITRANS和MAXTRANS都采用了默认值。
3.PCTFREE
该参数用于设置每个数据块中预留空间的百分比数。当数据块需要额外空间时使用PCTFREE参数设置的空间。该参数的默认值为10%。为了更好地理解PCTFREE参数的含义,先介绍数据块的结构,如图4-3所示。

图4-3 数据块结构图
数据块由三部分组成,即数据块头、空闲区和数据区,其中数据块头从上往下增长,而数据区是从下往上增长,若二者“碰头”则空闲区被占满。
但是一旦空闲区满,而且后续操作如修改数据增加了数据量,需要占用数据空间,此时该数据块就无法满足要求,这样就造成占用其他数据块的空间,这种空间的置换会导致磁盘I/O的效率低下,所以最好在一个数据块中放置修改的数据。所以Oracle设计了PCTFREE参数,在每个数据块中设置了一个预留空间,满足在数据操作时对数据块空间的要求。
如果修改的数据行需要额外的空间,就使用PCTFREE参数指定的预留大小的空间。
● FREELISTS:该参数是一个空闲数据块队列的列表,当用户向表中插入数据时,需要数据块作为存储空间,那么该参数中的数据块就作为候选的数据块。
● PCTUSED:该参数定义了数据块中已经使用的空间的百分比数。如果该数据块中已经使用的空间的百分比低于该参数值,该数据块会放入段中的空闲数据块列表。该参数的默认值为40%。
我们先使用例子4-13,查询SCOTT用户的表EMPLOYEES的参数设置。
例子4-13 查询SCOTT用户的表EMPLOYEES的参数设置
SQL> select TABLE_name,TABLEspace_name,pct_free,pct_used 2 from dba_TABLEs 3 where owner = 'SCOTT' 4* and TABLE_name = 'EMPLOYEES' TABLE_NAME TABLESPACE PCT_FREE PCT_USED --------------------------------------- ------------------- ------------------ -------------- EMPLOYEES LIN 10 40
上述输出结果显示该表的参数PCT_FREE为10,PCT_USED为40。下面使用ALTER TABLE指令动态修改表的参数,如例子4-14所示。
例子4-14 动态修改表的参数pctused和pctfree
SQL> ALTER TABLE scott.employees 2 pctused 50 3 pctfree 30; 表已更改。
为了验证修改结果,可以再次使用例子4-15来查看结果。
例子4-15 查看例子4-14对表参数pctused和pctfree的修改结果
SQL> select TABLE_name,TABLEspace_name,pct_free,pct_used 2 from dba_TABLEs 3 where owner = 'SCOTT' 4 and TABLE_name = 'EMPLOYEES'; TABLE_NAME TABLESPACE PCT_FREE PCT_USED -------------------- ---------- ---------- ---------- EMPLOYEES LIN 30 50
说明
由于Oracle中参数之间的相互关联性,修改一个参数很可能会影响其他参数的作用,所以,读者在刚开始学习Oracle时不要轻易修改系统的各种默认参数。