DB2学习笔记--数据库对象

1.模式
在应用程序中,如果模式没有被显示的指定,那么就会用运行改程序的用户名作为默认模式名。DB2中模式名不一定是用户名,db2内部没有用户名的概念,连接db2的用户必须是操作系统用户。
可用 sysibm.schemata 视图查看数据库创建了那些模式


sysibm模式存储系统数据字典
syscat模式存储系统视图
sysibmadm:是V9引入系统管理视图模式。
sysstat:统计视图模式,DB2优化器提供信息。


2.表
查看表字段及类型
[db2inst3@localhost ~]$ db2 describe table t1


                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
ID                              SYSIBM    CHARACTER                    1     0 Yes   
NAME                            SYSIBM    CHARACTER                   10     0 Yes 


查看当前用户名作为模式名的所有表
db2 list tables
查看所有模式名的所有表
db2 list tables for all
查看某模式名下的所有表
db2 list tables for schema schema_name
看表结构
db2 describe table tabname


3.表约束
约束类型:非空约束、唯一性约束、主键约束和外键约束、检查约束


[db2inst3@localhost ~]$ db2 "create table department(dept char(3) not null ,deptname char(20) not null,constraint dept_name unique(deptname),primary key (dept))"
DB20000I  The SQL command completed successfully.




[db2inst3@localhost ~]$ db2 "create table employee(empno char(6) not null,name char(30) , age int,wkdept char(3) not null,constraint dept foreign key (wkdept) references department(dept) on delete cascade,constraint age check(age<200))"
DB20000I  The SQL command completed successfully.


4.表状态:
对表结构进行更改时,会导致表处于reorg-pengding 状态
ALTER TABLE tabname ALTER colname SET DATA TYPE data_type
ALTER TABLE tabname ALTER colname SET NOT NULL
ALTER TABLE tabname DROP COLUMN colname
...




表压缩
ALTER TABLE tabname COMPRESS YES


查看压缩效果


select tabname ,data_object_l_size,data_object_p_size,dictionary_size from sysibmadm.admintabinfo where tabname = 'EMPLOYEE'


5.索引
B+数的每一个节点存放超过一组数据,所有的最终数据放在叶节点,中间的节点存放子节点的上限或者下限。
索引通过B+树可以将键值快速定位到叶节点,叶节点保存着一组RID,每个RID对应表中某个数据页与slot,可定位一行数据。


索引列通常为查询语句中的谓语列,索引可包含是一个字段也可是包含多个字段的复合索引,在复合索引中,先按照第一个键值排序,如果第一个键值相同而第二个不同则按照第二个键排序。在创建复合索引的时候要注意键值的顺序,不同的键值顺序带来的搜索效率可能会大相径庭。用户定义了索引后并不能保证每次访问都会被使用,DB2优化器会判定使用索引是否能提高效率,如果使用索引不如全表扫描则不使用索引。




创建索引的语法
create index idx_album_itempo on albums(itemno)
albums 表的itemno 字段创建普通索引idx_album_itempo
create unique index dba.empno on dba.employee(empno asc)
dba.employee 表的 empno 字段创建唯一索引 dba.empno。当表创建了主键或者唯一键时,会自动创建唯一索引
create index item on stock(itemno) cluster
cluster表示集群或者簇的意思,目的是尽量保持数据页的物理顺序与索引顺序保持一致,默认下表数据是无序组织的,当按照某一范围查询数据时,如果数据量大,需要的IO是很大的,如果数据在物理上连续,那么获取数据的速度就会快。
create unique index empidx on employee(empno) include (lastname,firstname)
只有唯一索引可以指定include ,最长访问的是员工工号和姓名,如果在员工号上建索引,查询姓名时,先找到工号RID,然后从表中获取姓名,至少需要两次IO(索引页IO和数据页IO),使用include时,include的字段会附加在索引键指向的RID上,这样就不需要读取数据页了。
create index name on employee(fistrname ,lastnam)
创建复合索引
查看表索引
[db2inst3@localhost ~]$ db2 describe indexes for table DEPARTMENT
[db2inst3@localhost ~]$ db2 describe indexes for table DEPARTMENT show detail


6.序列
sequence是db2的一个对象,按照一定规则产生自动增加的数字序列。这个序列一般做主键,没有其他意义。通过 NEXTVAL FOR seq_name 获取下一个值,通过PREVVAL 返回序列前一个值。
语法:
create sequence my_seq
as bigint
start with 1
increment by 1
no maxvalue
cycle
cache 100
cache 的目的是将一组连续值先算出来,缓存到内存中,每次获取从内存获得,用完再分配,如果连接断开,值将丢失,下次启动时从下组分配


db2 "insert into t1 values(nextval for my_seq , 'test')"

你可能感兴趣的:(DB2)