DB2数据库对象 —— 表
表设计
生成列
生成列在表中定义,在这些列中,存储的值是使用表达式计算得出的,而不是通过插入或更新操作指定1
2
3
4
5
6CREATE TABLE test.test1(
field1 INT,
field2 INT,
create_field1 INT GENERATED ALWAYS AS (field1 + field2),
create_field2 INT GENERATED ALWAYS AS (CASE WHEN field1 > field2 THEN 0 ELSE 1 END)
);
标识列
标识列为 DB2提供一种方法,可自动为添加至表的每一行生成唯一数值1
2
3
4CREATE TABLE test.test2(
field1 INT GENERATED ALWAYS AS IDENTITY(START WITH 1, INCREMENT BY 1),
field2 VARCHAR(10)
);
使用 GENERATED ALWAYS 定义的列始终由 DB2数据库管理器生成值,不允许用户或程序显式提供(不允许Insert值)
1 | CREATE TABLE test.test3( |
使用 GENERATED BY DEFAULT 定义的列可以由 DB2数据库生成值,但也允许用户或程序显式的提供该值(可以Insert值)
not null with default
1 | CREATE TABLE test.test( |
not logged initially
1. 创建不记日志表1
2
3
4CREATE TABLE test.test4(
field1 INT,
field2 VARCHAR(10)
)NOT LOGGED INITIALLY;
NOT LOGGED INITIALLY 激活后,如果此表相关语句失败(导致rollback),或者 ROLLBACK TO SAVEPOINT 被执行,那么整个事物将被回滚,并且被激活 NOT LOGGED INITIALLY 属性的表将被标记为不可访问,此表只能被删除并重建。
2. 在事物中激活不记日志特性,仅当前事务不记日志1
ALTER TABLE test.test3 ACTIVATE NOT LOGGED INITIALLY;
3. 不记日志清空表1
2ALTER TABLE test.test3 ACTIVATE NOT LOGGED INITIALLY WITH EMPTY TABLE;
TRUNCATE TABLE test.test3 IMMEDIATE;
append on
在DB2中,当表的数据被删除时,空间并不会释放,而是在原来位置做个删除标志,表示该空间可以重用。
当执行 Insert语句时,会扫描空闲空间并将新行置入。
而启用 append on特性后,那么 执行插入时不会扫描空间空间,而是直接插入到表的最后。1
ALTER TABLE test.test3 APPEND < ON | OFF >;
打开 APPEND ON 属性时,表不能有集群索引;
启用该属性,考虑定期 REORG 表。
pctfree
为每页预留可用空间,应付 row overflow
如果没有进行指定,默认预留 10%的空闲空1
2ALTER TABLE test.test3 PCTFREE 10;
ALTER TABLE test.test3 PCTFREE 0; --只读表
OVERFLOW
假如字段 name的数据类型为 VARCHAR(60),如果一开始 name长度为10个字节,这时值假设刚刚可以放到一个数据页中。
但是假如有一个 update操作将 name从10字节更新为60字节,
如果这个数据页无法放下,那么数据库就在当前位置存放一个指针,
把数据放到一个新的数据页中,这个就叫 overflow。
overflow会增加 I/O的读取,对性能不好。
volatile
如果表数据量经常变化非常大,导致统计信息不准确而不能执行索引扫描,
那么启用 volatile特性后,优化器将考虑使用索引扫描而不是表扫描1
ALTER TABLE test.test3 VOLATILE CARDINALITY;
对于这样的表,DB2在以下情况将执行索引扫描代替表扫描,而不考虑统计信息:
- 引用的所有列都是索引的组成部分
- 索引可以在索引扫描期间应用谓词
可以在 SYSCAT.TABLES 中查询出 “PCTFREE”、”LOCKSIZE“、”VOLATILE“、”APPEND ON“ 等信息
表维护
创建表
1 | CREATE TABLE test.tab ( |
1 | CREATE TABLE <table> LIKE <tgtTable> |
上述命令产生的新表不会自动创建表中部分的附属对象(唯一约束、外键约束、触发器、索引)
查询表
1 | -- 获取表 |
修改表
1 | -- 删除字段 |
删除表
1 | DROP TABLE <table>; |
参考
循序渐进DB2 (第5章)
IBM Knowledge Center