Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104917589
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917591
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917593
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917595
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917597
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917589
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917601
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917603
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917605
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917607
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917609
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917611
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917612
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917604
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917615
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917617
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917619
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917621
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917623
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917625
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917627
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917619
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917631
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917633
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917635
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917637
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917639
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917641
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917643
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917634
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917646
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917648
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917650
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917652
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917654
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917657
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917649
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917661
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917663
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917665
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917666
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917667
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917668
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917669
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917670
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917671
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917672
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917673
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917664
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917675
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917676
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks

DB2 9 数据库管理(731 考试)认证指南,第 2 部分: 数据放置(6)-sdccf-ChinaUnix博客
  • 博客访问: 104917677
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-13 14:07:35

developerWorks



创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68296) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68295) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68294) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68293) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68292) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68291) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68290) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68289) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68288) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68287) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68286) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68285) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68284) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68283) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68282) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68281) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68279) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68278) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68276) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68274) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68271) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68270) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68269) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68267) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68266) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68265) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68264) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68263) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68261) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68260) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68259) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68257) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68256) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68255) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68254) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68253) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68252) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68251) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68250) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68249) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68247) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68246) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~


创建和维护不同的 DB2 对象

本节讨论以下对象的作用和用法:

  • 缓冲池
  • 表空间
  • 表和索引
  • 视图
  • 标识列
  • 临时表
  • 约束
  • 触发器

数据库缓冲池区域是一块内存,当从磁盘上读取一个表的索引和数据页,以便对它们进行扫描或修改时,可以用缓冲池缓存它们。缓冲池区域有助于提高数据库系统的性能,因为它允许从内存,而不是磁盘上访问数据。由于内存访问比磁盘访问要快得多,因此 DB2 对磁盘读写得越少,系统的性能就越好。

当创建一个数据库时,会自动为该数据库创建一个默认的缓冲池。这个缓冲池名为 IBMDEFAULTBP,它的页宽为 4 KB,它的大小取决于操作系统。对于 Windows,默认缓冲池大小为 250 页或 1 MB;对于 UNIX,默认缓冲池大小为 1,000 页或 4 MB。默认缓冲池不能被删除,但是可以通过 alter bufferpool 命令改变它的大小。







create bufferpool 命令有一些选项,可用于指定以下方面:

缓冲池名称
指定缓冲池的名称。该名称不能用于任何其他缓冲池,也不能以字符 SYS 或 IBM 开头。
immediate
规定如果系统上有足够的内存,则立即创建缓冲池。如下所述,如果数据库共享内存中没有预留足够的空间来分配新的缓冲池,那么将返回一个警告,并且缓冲池的创建将被推迟(DEFERRED)。(immediate 是默认设置。)
deferred
规定在下一次数据库被停止和重新启动时再创建缓冲池。
all dbpartitionnumbs
规定将缓冲池创建在数据库中的所有分区上。如果没有指定数据库分区组,那么这是默认设置。
database partition group
指定将在其中创建缓冲池的数据库分区组。缓冲池将被创建在被指定的分区组所包含的所有数据库分区上。
size
指定缓冲池的大小,并且以页为单位。在分区数据库中,对于存在缓冲池的所有数据库分区,这将是默认大小。
numblockpages
指定在缓冲池的基于块的区域中创建的数据页的数量。numblockpages 的实际值可能与指定的值不符,因为其大小必须是 blocksize 的倍数。缓冲池中基于块的区域不能超过缓冲池大小的 98%。如果将基于块的区域的大小指定为 0,则会禁用缓冲池的块 I/O。
blocksize
指定在缓冲池基于块的区域中的一个给定块中的数据页的数量。块的大小必须介于 2 页与 256 页之间。默认值是 32 页。
pagesize
指定缓冲池的页宽。默认页宽为 4 KB 或 4,096 字节。页宽可以按字节或千字节指定。
extended storage/not extended storage
指定是否将缓冲池中受到危害的页复制到被称作扩展存储(extended storage)的辅助缓存中。从扩展存储检索数据比从磁盘检索数据更为高效,但是不如从缓冲池检索数据高效,因此它不适用于 64 位环境。

定义好缓冲池的页宽和名称后,便不能更改它们。







下面的语句:

create bufferpool BP1 size 25000 

创建一个名为 BP1 的缓冲池,其大小为 100 MB(25,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于 IMMEDIATE 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP2 size 25000 pagesize 8 K

创建一个名为 BP2 的缓冲池,其大小为 200 MB (25,000 个 8 KB 的页面)。该缓冲池使用 8 KB 的页宽。由于 immediate 选项是默认的,因此只要有足够的可用内存来满足请求,就可以立即为缓冲池分配空间并使之可用。

下面的语句:

create bufferpool BP3 deferred size 1000000

创建一个名为 BP3 的缓冲池,其大小为 4 GB (1,000,000 个 4 KB 的页面)。由于没有指定页宽,缓冲池使用默认的 4 KB 页宽。由于指定了 deferred 选项,因此直到数据库被停止并重新启动时才会为该缓冲池分配空间。







为了在数据库中创建一个表,必须首先连接到该数据库。您还必须有实例中的 SYSADM 权限,或者数据库中的 DBADM 权限或 createtab 特权。

当创建一个表时,可以指定以下方面:

  • 模式
  • 表名
  • 列定义
  • 主/外键
  • 用于数据、索引和大型对象的表空间

下面的图展示了一个例子。

创建表的语法





如果在创建一个表时没有使用 in 子句,那么将按以下顺序放置表数据(及其索引和 LOB 数据):

  • 如果有 IBMDEFAULTGROUP 表空间,并且该表空间的页宽足够大,则放在这个表空间中。
  • 放在一个用户创建的表空间中,该表空间具有能满足表的最小页宽。
  • 如果有 USERSPACE1 表空间,并且该表空间的页宽足够大,则放在 USERSPACE1 中。

ININDEX INLONG IN 子句指定将在其中存储常规表数据、索引和大型对象的表空间。注意,这只适用于 DMS 表空间。







可以使用以下命令来获取表信息:

命令 描述
list tables 列出用于当前用户的表
list tables for all 列出数据库中定义的所有表
list tables for schema schemaname 列出指定模式中的表
describe table tablename 显示指定的表的结构

例如,下面的命令:

describe table department

产生以下输出:

describe table 的输出





索引可以:

  • 按升序或降序排列(默认情况下,如果没有指定,则按升序)。
  • 是惟一的(unique)或非惟一(non-unique)的(默认情况下,如果没有指定,则为非惟一的)。
  • 是复合的。
  • 用于实施聚合。
  • 是双向的 —— 这是由 allowdisallow reverse scans 控制的。
  • 包括附加的列 —— 这只适用于惟一索引。

下面有一些 create unique 语句演示了这些选项:

create unique index itemno on albums (itemno) desc
create index clx1 on stock (shipdate) cluster allow reverse scans
create unique index incidx on stock (itemno) include (itemname)
create index item on stock (itemno) disallow reverse scans collect detailed statistics







标识列(identity column)是表中的一个数字列,它导致 DB2 为每个被插入表中的行生成一个惟一的数值。一个表最多只能有一个标识列。这个列的值可以通过 DB2 alwaysby default 两种方式生成:

  • 如果这些值按 always 方式生成,则总是由 DB2 数据库生成这些值,应用程序不能提供显式的值。
  • 如果这些值按 by default 方式生成,那么可以由应用程序显式地提供这些值;只有在应用程序没有提供值的情况下,才由 DB2 生成一个值。 因此,DB2 不能保证这些值是惟一的。该选项用于数据传播,或者装载和卸载一个表。

我们来看一个例子。假设用以下命令创建表:

create table inventory (partno INTEGER GENERATED ALWAYS AS IDENTITY
          (START WITH 100 INCREMENT BY 1), description CHAR(20) )

并执行以下语句:

语句 结果
insert into inventory VALUES (DEFAULT,'door') 
insert into inventory (description) VALUES ('hinge') 
insert into inventory VALUES (200,'windor') 
insert into inventory (description) VALUES ('frame')

inserts 100,door
inserts 101,hinge
error
inserts 102,frame

那么语句 SELECT * FROM inventory 将产生如下输出:

100 door
101 hinge
102 frame







视图是从一个或多个基本表、别名或视图中派生出来的,在检索数据时与基本表可以互换使用。当更改一个视图中的数据时,表本身中的数据也随之更改。通过创建视图,可以限制对敏感数据的访问,同时允许对其他数据的访问。

视图中的数据并不是存储在表之外的。换句话说,虽然视图的定义在系统编目中占用了空间,但是视图本身并不占用数据库中的空间。

视图的创建者至少需要拥有视图定义中引用的基本表上的 SELECT 特权。

关于所有已有视图的信息存储在:

  • SYSCAT.VIEWS
  • SYSCAT.VIEWDEP
  • SYSCAT.TABLES

下面的 create view 语句展示视图的工作原理:

create view DEPTSALARY AS SELECT DEPTNO, DEPTNAME, SUM(SALARY) 
          AS TOTALS FROM PAYROLL GROUP BY DEPTNO,DEPTNAME
create view EMPSALARY AS SELECT EMPNO, EMPNAME, SALARY FROM PAYROLL, 
          PERSONNEL WHERE EMPNO=EMPNUMB







with check option 指定以下约束,即通过一个视图插入或更新的每一行必须符合视图的定义。不符合视图定义的行就是不满足视图的搜索条件的行。

例如,考虑下面的命令:

create view emp_view2 (empno, empname, deptno) AS (SELECT id, name, 
          dept FROM employee WHERE dept = 10)with check option

当该视图被用于插入或更新新的值时,with check option 限制 dept 列的输入值。







DB2 中有很多类型的约束:

  • 参照完整性约束
  • 惟一性约束
  • 检查约束
  • 信息约束

约束是不能直接修改的,必须先删除约束,然后用您想要的特征创建一个新的约束。

下面分别讨论每种约束。







在创建数据库,或创建数据库后使用 alter table 语句时,将定义参照完整性约束。

建立参照完整性的子句有:

  • primary key 子句
  • unique constraint 子句
  • foreign key 子句
  • references 子句

例如:

create table artists (artno INT, ...  primary key (artno) foreign key dept (workdept) 
          references department on delete no action)

我们来看看各种不同的参照完整性规则。

插入规则:

  • 有一条隐含的规则,即当被插入行的父行不存在时,不能插入。

删除规则:

  • 限制:如果仍有从属的行,则父行不能删除。
  • 级联:删除父表中的一行同时也会删除从属表中所有相关的行。
  • 无动作(默认情况):在应用所有其他参照约束后,对于每个子行,都强制要求父行的存在。
  • 设置 Null:外键字段设为 null;其他列保持不变。

更新规则:

  • 限制: 如果从属表中的一行与键的初值相匹配,那么对父键的更新将被拒绝。
  • 无动作(默认情况):如果在从属表中没有匹配的行,那么对父键的更新将被拒绝。






惟一性约束可以用作一个外键约束的主键,就像显式声明的主键一样。这允许将 RI 约束(请参阅 参照完整性约束)放在同一个表中的不同列上。

惟一性约束迫使列中的值是惟一的;列不能包含 null 值。







检查约束用于强制实施表级的数据完整性。它迫使表中的值符合约束。随后所有的插入和更新都必须遵从表上定义的约束,否则该语句将失败。

如果表中已有的行不满足约束,则不能定义该约束。为了加快添加大量数据时的速度,可以关闭约束检查,但是表将处在 CHECK PENDING 状态。







信息约束是可以由优化器使用的规则,但不是在运行时实施。对于插入、更新或删除操作,其他约束可能导致额外的开销,因此,如果应用程序已经对数据进行了验证,那么使用信息约束也许是更好的方案。

信息约束可以是:

  • ENFORCED:该约束由数据库管理器在常规操作(例如插入、更新或删除)期间实施。
  • NOT ENFORCED:如果使用该约束,当表中任何数据违反该约束时,DB2 可能返回错误的结果。
  • ENABLE QUERY OPTIMIZATION:在适当环境下,该约束可用于查询优化。
  • DISABLE QUERY OPTIMIZATION:该约束不能用于查询优化。






触发器(trigger)定义一组动作,这组动作由指定的基本表上的一个动作激活或触发。被触发的动作可能导致对数据库的其他更改,或产生一个异常。触发器可以在插入、更新或删除之前之后 触发。

触发器用于:

  • 验证,这类似于约束,但是更为灵活。
  • 调节,允许将新的数据修改或调整为一个预定义的值。
  • 完整性,类似于参照完整性,但是更为灵活。

阅读(68245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~