10.1.2 表的创建
在创建表时,可以同时为表指定一些重要的属性,如存储参数、所属表空间等。这些属性都通过CREATE TABLE命令的子句指定。
1.PCTFREE和PCTUSED子句
这两个参数的作用是用来控制数据块的空间使用情况。为了减少数据块间的迁移,在创建表时可以通过PCTFREE和PCTUSED子句指定数据块空间的使用情况。考虑以下创建表的语句:
SQL>CREATE TABLE T1(
name varchar2(10))
PCTFREE 20
PCTUSED 40;
在表T1中,每个数据块都有20%的保留空间。当可用空间使用完后,新的数据将被写入另外一个数据块。当从表中删除数据时,数据块中已用空间不断减少,当减少到40%时,可再次向该数据块中插入数据。
在使用PCTFREE和PCTUSED子句时,可以参考以下原则:
·PCTFREE和PCTFUSED的值必须小于或等于100%。
·如果在一个表上很少执行UPDATE操作,可以将PCTFREE设置得尽量小。
·PCTFREE与PCTUSED之和越接近100%,数据块的空间利用率越高。
2.TABLESPACE子句
TABLESPACE子句用来指定将表创建在哪个表空间上。如果不指定TABLESPACE子句,用户将在自己的默认表空间上创建表。
为了能够在指定的表空间上创建表,当前用户必须在该表空间上有足够的空间配额或在数据库中具有UNLIMITED TABLESPACE权限。
3.INITRANS和MAXTRANS子句
数据库中的数据存储在数据块中,用户的事务最终要修改数据块中的数据。Oracle允许多个并发的事务同时修改一个数据块中的数据。每当用户的事务开始作用于一个数据块时,数据库服务器将在该数据块的头部为该事务分配一个事务项,以记录事务的相关信息。事务结束时,对应的事务项将被删除。
INITRANS和MAXTRANS参数用于控制一个数据块上的并发事务数量,其中INITRANS用于指定初始的事务数量。MAXTRANS用于指定最大的并发事务数量。
当创建一个表时,数据库服务器按照INITRANS的值为每个数据块分配一定的事务项,这些事务项将一直保留到该表被删除。当一个事务访问数据块时,将占用其中的一个事务项,事务结束时,将释放事务项。当这些预先创建的事务项全部被占用后,如果又有新的并发事务发生,数据库服务器将在数据块的可用空间中为事务创建一个新的事务项。在任一时刻,数据块中的事务项不会超过MAXTRANS参数值。
例如,在利用以下语句创建表时,指定初始的事务项为10,最大的并发事务数量为200。
SQL>CREATE TABLE T3(
name varchar2(10)
)
INITRANS 10
MAXTRANS 200;
INITRANS和MAXTRANS参数的值可以根据用户对表的访问情况进行设置。如果参数值过大,事务项将占用更多的数据块空间,那么数据可以利用的空间将减少。如果参数设置过小,有些事务将因为无法分配到事务项而等待,从而降低了数据库的性能。一般情况下,如果多个用户同时访问表的情况很少发生,可以为这两个参数设置较小的参数值,反之要为这两个参数指定较大的参数值。
4.CACHE子句
CACHE子句用于指定将表中的数量放在数据库高速缓存中,并保留一段时间。如果在创建表时指定了CACHE字句,那么在用户第一次访问表中的数据时,这个表将整个被读到数据库高速缓存中,并保留较长的一段时间,这样用户以后再访问该表时,可直接访问数据库高速缓存中的数据,从而提高访问的效率。
在默认情况下创建表时使用NOCACHE子句。对于一些较小的、用户访问频繁的表,在创建时可以考虑使用CACHE子句,以提高访问效率。
5.PARALLEL子句
在一般情况下,通过INSERT命令向表中写入数据时,一次写入一行数据,这样的写操作是串行进行的。如果在创建表时指定了PARALLEL子句,那么在向表中以批量方式写入大量数据时就是以并发方式进行的,这样可以大大提高处理的速度。例如,利用以下语句创建表时,将实现并发操作。
SQL>CREATE TABLE T4
PARALLEL
AS SELECT*FROM emp;
如果不希望在表上以并发方式写入数据,在创建表时需要指定NOPARALLEL。
6.LOGGLING子句
在默认情况下,用户在表上执行DDL和DML命令时,服务器进程都会产生重做日志。
如果不希望产生重做日志,在创建表时需要指定NOLOGGING子句。使用NOLOGGING子句有以下好处:
·由于不写重做日志,因而节约了重做日志文件的存储空间。
·减少了处理时间。
·在以并行方式向表中写入大量数据时提高了效率。
当然在使用NOLOGGING子句时也有不好的一面。因为没有重做日志,当表被破坏时,将无法进行恢复,所以在表创建后应该及时对其进行备份。
7.COMPRESS子句
如果在创建表时使用了COMPRESS子句,那么一个数据块中两行完全相同的数据将被压缩为一行,并存储在数据块的开始,在数据块中本应存储这两行数据的地方只存储该行数据的引用。
使用表的压缩功能可以减少表所占用的存储空间和数据库高速缓存空间,并且可以提高查询速度。
表的压缩功能一般用在向表中批量插入数据的情况(例如基于查询创建表)。一个表中可以包含压缩的和未压缩的数据,所有DML操作均可应用于这些压缩的数据。
例如,下面的语句用于创建表T5,这个表具有压缩功能,支持并发的数据写入,对DDL和DML命令不产生重做日志。
SQL>CREATE TABLE T5
PARALLEL
NOLOGGING
COMPRESS
AS SELECT*FROM EMP;
临时表是一种特殊类型的表,表中的数据并不永久保存,而是一些临时数据。这些临时数据只在当前事务或当前会话中有效,当事务或会话结束时,这些临时数据将被全部删除。
创建临时表的命令是CREATE GLOBAL TABLE。在创建临时表时还需要通过ON COMMIT子句指定临时数据的有效范围。如果指定了ON COMMIT DELETE ROWS子句,那么临时表是事务级的,当事务提交或回滚时,临时表中的数据即被删除。如果指定了ON COMMIT PRESERVE ROWS子句,那么临时表是会话级的,表中的数据将一直保留,直到当前会话结束时才被删除。
以下语句用于创建一个事务级的临时表:
SQL>CREATE GLOBAL TEMPORARY TABLE T6(
name varchar2(10)
)
ON COMMIT DELETE ROWS;