本文主要介绍的表的管理。
1 创建表
需要有create any table权限,创建表时,应当为表指定一个表空间,否则,表将在 MAIN 创建。
示例:
CREATE TABLE EMPLOYEE (
EMPNO INT PRIMARY KEY,
ENAME VARCHAR(15) NOT NULL,
JOB VARCHAR(10),
MGR INT
CONSTRAINT EMP_FKEY REFERENCES EMPLOYEE(EMPNO),
HIREDATE DATE DEFAULT (CURDATE),
SALARY FLOAT,
DEPTNO TINYINT NOT NULL
CONSTRAINT DEPT_FKEY REFERENCES DEPT(DEPTNO))
STORAGE (
INITIAL 50,
NEXT 50,
MINEXTENTS 10,
FILLFACTOR 80,
ON USERS);
表(列存储表和堆表除外)都是使用 B+树(以下简称 B 树)索引结构管理的,每一个普通表都有一个聚集索引, 数据通过聚集索引键排序, 根据聚集索引键可以快速查询任何记录。
当建表语句未指定聚集索引键,DM 的默认聚集索引键是 ROWID,即记录默认以 ROWID在页面中排序。ROWID 是 B 树为记录生成的逻辑递增序号,表上不同记录的 ROWID 是不一样的,并且最新插入的记录 ROWID 最大。很多情况下,以 ROWID 建的默认聚集索引并不能提高查询速度,因为实际情况下很少人根据 ROWID 来查找数据。
因此,DM 提供三种方式供用户指定聚集索引键:
- CLUSTER PRIMARY KEY:指定列为聚集索引键,并同时指定为主键,称为聚簇主
- 键;
- CLUSTER KEY:指定列为聚集索引键,但是是非唯一的;
- CLUSTER UNIQUE KEY:指定列为聚集索引键,并且是唯一的。
例如,创建 student 表,指定 stu_no 为聚簇主键。
CREATE TABLE STUDENT(
STUNO INT CLUSTER PRIMARY KEY,
STUNAME VARCHAR(15) NOT NULL,
TEANO INT,
CLASSID INT
);
指定聚簇索引键后,如果查询条件中含有聚簇索引键,可以定位记录在 B 树上的位置,使查询性能大大提高。然而,插入记录也需要根据聚簇索引键定位插入位置,有可能导致页面的分裂而影响插入性能。
在 dm.ini 配置文件中,可以指定配置项使表中的主键自动转化为聚簇主键,该配置项为 PK_WITH_CLUSTER。默认情况下,PK_WITH_CLUSTER 为 1,即建表时指定的主键自动转化为聚簇主键;若为 0,则主键不会自动变为聚簇主键。
填充因子:
表的填充因子也就是索引的填充因子索引的填充因子指在新建和重组索引时, 页面记录存储空间占页面总大小的百分比。
而这部分预留空间是为更新字段时使用的,一个有效的填充因子可以大大减少由更新记录导致的页面拆分。
原则上,在只读表上应该设置填充因子高,而有大量更新的表上应该设置较低的值。默认情况下,DM 新建的表和索引的填充因子是 100,可根据实际情况设置合适的填充因子大小。
当填充因子取值低,则需要更多的页来存储数据,因而读取范围大,会影响性能。而当填充因子取值高,则在更新数据时可能造成大量的页拆分,页拆分需要消耗较多 CPU 和 I/O资源,同样会影响性能。
如 果 用 户 通 过 单 表 的 全 表 查 询 进 行 建 表 操 作 , 则 可 以 通 过 将 INI 参 数
CTAB_SEL_WITH_CONS 置为 1 进行原始表上约束的拷贝,列上能拷贝的约束包括默认值属
性、 自增属性、 非空属性以及加密属性, 表上能拷贝的约束包括唯一约束、 PK 约束以及 CHECK约束。
2 临时表
DM 允许创建临时表来保存会话甚至事务中的数据。在会话或事务结束时,这些表上的数据将会被自动清除。
在临时表创建过程中,不会像永久表和索引那样自动分配数据段,而是仅当第一次执行 DML 语句时,才会为临时表在临时表空间中分配空间。并且,对于不同的会话, 临时表上的数据是独享的, 不会互相干扰, DM 临时表支持以下功能:
- 在临时表中,会话可以像普通永久表一样更新、插入和删除数据;
- 临时表的 DML 操作产生较少的 REDO 日志;
- 临时表支持建索引,以提高查询性能;
- 在一个会话或事务结束后,数据将自动从临时表中删除;
- 不同用户可以访问相同的临时表,每个用户只能看到自己的数据;
- 临时表的数据量很少,意味着更高效的查询效率;
- 临时表的表结构在数据删除后仍然存在,便于以后的使用;
临时表的权限管理跟普通表一致。
临时表 ON COMMIT 关键词指定表中的数据是事务级还是或会话级的,默认情况下是事务级的。 - ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;
- ON COMMIT PRESERVE ROWS:指定临时表是会话级的,会话结束时才清空表,并释放临时 B 树。
下面的例子创建一个事务级的临时表:
CREATE GLOBAL TEMPORARY TABLE TMP_EMP(
EMPNO INT PRIMARY KEY,
ENAME VARCHAR(15) NOT NULL,
JOB VARCHAR(10))
ON COMMIT DELETE ROWS;
3 更改表
通过更改表,用户可以对数据库中的表作如下修改:
- 添加或删除列,或修改现有的列的定义(列名、数据类型、长度、默认值) 。其中,
- 对于添加列,当设置 INI 参数 ALTER_TABLE_OPT 为 1 时,添加列采用查询插入
- 实现,可能会导致 ROWID 的改变;ALTER_TABLE_OPT 为 2 时,系统开启快速加
- 列功能,对于没有默认值或者默认值为 NULL 的新列,系统内部会标记为附加列,
- 能够达到瞬间加列的效果, 此时 ROWID 不会改变, 若有默认值且默认值不为 NULL,
- 则仍旧采取查询插入实现。
- 添加、修改或删除与表相关的完整性约束;
- 重命名一个表;
- 启动或停用与表相关的完整性约束;
- 启动或停用与表相关的触发器;
- 修改表的 SPACE LIMIT;
- 增删自增列。
4 删除表
drop
truncate
delete
delete和drop操作后空间释放受到undo_retention的时间限制,在超时之后才会完全释放,truncate操作立即释放。
5 查看表的定义
创建表后,可以通过 SP_TABLEDEF 系统过程查看表的定义。
CALL SP_TABLEDEF(‘SYSDBA’, ‘EMPLOYEE’);
DM 通过提供的 TABLEDEF 函数来显示当前表的定义。当表多次进行 ALTER TABLE 后,
显示的表定义将是最后一次修改后的建表语句。
6 查看自增列信息
DM 支持 INT 和 BIGINT 两种数据类型的自增列,并提供以下函数查看表上自增列的当
前值、种子和增量等信息:
- IDENT_CURRENT:获得表上自增列的当前值;
- IDENT_SEED:获得表上自增列的种子信息;
- IDENT_INCR:获得表上自增列的增量信息。
CREATE TABLE IDENT_TABLE (
C1 INT IDENTITY(100, 100),
C2 INT
);
SELECT IDENT_CURRENT('SYSDBA.IDENT_TABLE');
SELECT IDENT_SEED('SYSDBA.IDENT_TABLE');
SELECT IDENT_INCR('SYSDBA.IDENT_TABLE');
SQL> insert into ident_table (c2) values(10);
SQL> select * from ident_table;
行号 C1 C2
---------- ----------- -----------
1 100 10
7 约束
当这个约束被删除或者是被禁用,索引就会被删除
查看约束信息
用户可以在系统表SYSOBJECTS和SYSCONS中查询约束的信息。 例如, 在SYSOBJECTS
系统表中查找约束名为 t_con_pk 的信息。
SELECT * FROM SYSOBJECTS WHERE NAME='T _CON _PK';
查找所有约束的信息:
SELECT * FROM SYSOBJECTS WHERE TYPE$='CONS';