第10章 基本数据库对象管理

无论是数据库管理员,还是普通用户,都需要经常对数据库对象进行管理,如数据库对象的创建、删除、修改等。Oracle中的数据库对象包括表、索引、视图、存储程序、序列等,这些数据库对象以一种逻辑关系组织在一起,这就是模式(schema)。

模式是一个用户所拥有的所有数据库对象的集合。每个数据库对象都属于某个用户,一个用户所拥有的数据库对象就组成了一个模式,模式的名称与用户名相同。当创建用户时,就同时产生了一个模式,在默认的情况下,用户在自己的模式中有所有的权限。

在第1章中,我们已经详细介绍了基本数据库对象的用法,只是当时是站在普通用户的角度,以一种通用的方式介绍它们的用法的。在本章中,我们将站在数据库管理员的角度,重新考虑这些数据库对象在Oracle中所涉及的特性,如存储结构、数据的组织方式等。

10.1 表的管理

表的管理涉及表的结构、表的创建、修改与删除等操作,以及临时表、分区表和索引组织表三种特殊类型的表。

10.1.1 表的结构

在数据库中,表是最基本的数据库对象,用来存储系统或用户的数据。表中的数据是按照行和列的格式存放的。表中的各行数据一般以写入的先后顺序存放,而一行中的各列一般按照定义表时指定的顺序存放的。

在逻辑结构上,一个表位于某个表空间。当创建一个表时,将同时创建一个表段,用于存放表中的数据。在物理结构上,表中的数据都存放在数据块中,因而在数据块中存放的是一行行的数据。图10.1为数据块中一行数据的结构。

figure_0271_0087

图 10.1 行的结构

其中行的头部记录了该行中列的个数、行间的全连接、加锁信息等。列长度记录一个列实际占用的字节数,而列值则记录了该列实际存放的数据。

表中的每一行数据都有一个行号,用于标识该行数据的物理位置。根据这个行号,可以直接定位该行数据。行号可以通过伪列ROWID获得。例如,以下查询得到表DEPT中的数据及每行的行号。


SQL>SELECT ROWID, DEPTNO, DNAME, LOC FROM DEPT;

ROWID DEPTNO DNAME LOC


AAABhdAABAAAFuKAAA 10 ACCOUNTING NEW YORK

AAABhdAABAAAFuKAAB 20 RESEARCH DALLAS

AAABhdAABAAAFuKAAC 30 SALES CHICAGO

AAABhdAABAAAFuKAAD 40 OPERATIONS BOSTON


行号是由数据库服务器自动生成的字符串,包含18个字符。行号的组成如图10.2所示。

figure_0272_0088

图 10.2 行号的组成

其中前六个字符表示数据库对象的编号,用来指定该行数据属于哪个数据库对象。在数据库中每个数据库对象都有一个唯一的编号。

从第七个到第九个共三个字符表示数据文件的相对编号,用来指定该行数据存储在哪个数据文件中。在数据库中每个数据文件中有两个编号,一个是绝对编号,它是数据文件在整个数据库范围内的编号,另一个是相对编号,它是数据文件在一个表空间范围内的编号。

从第十到第十五共六个字符表示数据块的编号,用来指定该行数据位于哪个数据块中。

最后三个字符表示行号,用来指定该行数据在数据块中位于第几行。为了使用户对行号的进行解析,Oracle提供了一个DBMS_ROWID程序包,利用这个程序包中的函数可以对行号进行分析。DBMS_ROWID中各个函数的用法如表10.1所示。

figure_0272_0089

例如,以下查询将得到dept表中每行数据所在的文件编号、数据库对象的编号、数据块编号和在数据块中的行号:


SQL>SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)AS相对文件号,

DBMS_ROWID.ROWID_OBJECT(rowid)AS对象编号,

DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)AS数据块编号,

DBMS_ROWID.ROWID_ROW_NUMBER(rowid)AS行号

FROM dept;