- 论坛徽章:
- 0
|
Db2究竟是什么
或者软件产品究竟是什么
其实更多的时候我们需要的是主动思考
比如
我从何处来
我是谁
我为什么是我
自我的意识是否真的随身体的死亡而结束?
这不是玩笑
最起码这是我经常思考的事情
那么我们该如何掌握db2呢
很简单
第一,
是产品本身的功能的组成
比如容器,表空间,日志,缓冲池等等。
第二
就是产品的外延功用
也就是说第一是我们如何来管理产品
管理的目的就是产品必须提供给我们服务来达到我们的特定的需求目的
那么数据库的外延的功用就是将社会的活动的社会流变成数据库内部的逻辑流。
逻辑流的实现就是以我们今天要说的数据库的对象为基础的。
数据库的对象
表空间
表
缓冲池
视图
触发
存过
程序包
序列
等等
记住”等等”不是数据库的对象,只是表达 etc. 的意思。
1 数据库
数据库是以下的概念的逻辑组成
表空间
表
缓冲池
视图
触发
存过
程序包
序列
数据库分区
我们知道分区完全是为了巨型表的处理的需要而创造了分区的概念来充分将一个逻辑数据库分在>1个的物理机器上面,以充分利用各个机器的资源来服务某个特定的表的需要
以上就是数据分区的根本目的
就是 众人拾柴火焰高。
现在的那个可以导致黑洞的欧洲粒子加速器的数据就是在全球处理,举全球之力来处理,
因为数据实在是海量了。
当然我们也可以一个物理机器上面来创建数据库分区。
数据库节点文件
分区的数据库如何知道啥分区在啥机器上面?
所有的活动都是这样
总会有个司令部,这就是分区数据库中的IBMCATGROUP
他主要的任务就是管理协调所有的分区
数据库节点文件
就是摆在他桌子上面的作战图纸,
记录了每个分区的所在。
这个文件一般是由 5 列。
但是我们一般只是用到 3 列。
1 分区号 2 主机名称 3 逻辑端口
逻辑端口实际就是数据库分区在创建的时候db2自动为之分配的一个db2内部fmp进程通讯的逻辑地址。
数据库分区可以用add dbpartitionnum的命令
删除数据库分区可以用drop dbpartitionnum的命令
分区组
顾名思义
分区组就是n个分区的组合而成的概念
分区组的目的就是对分区的灵活的组合,
因为也许在我们的环境中,每个参与分区的机器的资源条件不一样。
所以,我们在负荷的分配上面就不能搞大锅饭和大平均了。
我们再想
表是存在于表空间的。
分区数据库对巨型表的处理主要是利用表空间的跨分区的存在来实现的。
而表空间的建立可以这样的
所以
我们现在就可以集中注意力规划好我们的分区组就可以了。
当然,我们还可以将宝贵的内存资源分配到不同的分区上面。
否则的话,假设我们创建了一个缓冲池是1M,那么每个分区就会自动创建一个缓冲池是1M。
这明显不够合理和科学,也违背我们目前以人为本的社会精神。
Db2的数据库中默认有3个分区组,分别是:
IBMCATGROUP
是数据库编目信息的所在,当然也是db2的syscatspace表空间的所在,就是大本营的概念。
IBMTEMPGROUP
就是系统的临时表空间的所在,每个库只能有一个如此的分区组。
IBMDEFAULTGROUP
就是USERSPACE1表空间的所在,就是默认用户表的创建所在,如果你在创建表的时候不指定表空间的话。
表空间
表空间实在说的太多了,我们就不多说了。
根据表空间其中存放数据的种类,表空间可以分为3类。
常规表空间
就是存放除了临时数据以外的数据的表空间,是我们创建表空间的时候默认类型。
大表空间
就是用来存放LONG VARCHAR, LONG VARGRAPHIC或者其他的大对象的数据的表空间,但是对大对象的处理实在是很影响性能,因为大对象的处理都是直接的io的读写,因此,性能的低下可想而知。所以,建议大家不要把大对象作为关系型的数据来处理,在具体程序的设计方面当然还是有很多的办法来变化。
临时表空间
顾名思义
这个表空间就是放置临时数据的。
临时表空间还继续分,分成
系统临时表空间
和
用户临时表空间
系统临时表空间
当db2内部来处理sql语句的排序操作的时候,比如order,group,join等等的时候,这样的数据都是需要在系统临时表空间里面来进行处理。
所以
你们平时可以注意一下,当一个排序的操作的表比较大的时候,这样的数据大小就会超过相应的排序堆的大小,你们可以抓一下TEMPSPACE1的snap,就会发现很不少的数据的异步读写,这就说明相应的数据就是默认从内存到系统临时表空间中来处理了。
用户临时表空间
这个表空间就不是为排序的数据来存放的,而是当用户自己在程序中发布这样的sql命令的时候,
DECLARE GLOBAL TEMPORARY TABLE
这样
这个临时表就是创建在用户临时表空间中。
当然,索引是可以放置在大对象或者常规表空间中。
Schema
中文有人叫 模式
其实这个翻译并不太准确
我们姑且还是称之为 schema
为什么会有schema?
我们看sap的一个数据库,大概有近10w张表,
这是一个很大的数量。
这么多的表,我们想想,肯定会有很多是性质类似的表,那么我们如何来界定和区分才能做到遴选的高效率。
大家都知道,恰当的信息才是有价值的信息。
过多的信息其实就是垃圾。
所以
为了便于管理数据库对象,就创建了 schema 这个概念。
当一个数据库创建之后
默认的模式有:
Syscat
Sysibm
Systools
Sysstat
这些都是db2自己创建的db2系统所使用的模式,每种模式都有自己的含义,比如说
Syscat 都是表示 这个模式之下的表都是关于编目信息的表。
Sysibm 就是表示这个模式之下的表都是关于db2系统信息的表
Sysstat 就是表示 这个模式之下的表都是跟统计信息参数有关的表
明白了吗,可以偷窥到一点感觉了吧
我们现在可以归纳
Schema
就是数据库对象的高级界定符,用来对数据库对象按照功能性质进行逻辑分组,从而实行一定的高效的管理性。
同时,
Schema的另外的作用就是对数据库的对象按照组进行权限管理,
比如
一个单位内部
拥有人力资源组的表的权限的用户就不能去访问销售信息组的表的内容。
这是一个重要的作用。
提供了一种基于组的表的权限的控制和分配。
模式和用户没有关系。
但是我们在创建表的时候如果不特别指定schema,那么db2就会以当前连接的用户名称来为这个表创建一个模式。
很多时候,我们就会混淆,以为用户id和shcema之间有啥暧昧关系。
其实他们之间是清白的。
但是我们如果发布这样的语句:
Create table a.b
这样,db2就既创建了表b,又创建了模式a。
当然我们自然可以用这样的语句来专门创建模式a
Create schema a
在db2中,很多数据库对象的创建都有很多的显式的或者隐式的方法。
说的具体了,就是糊涂。
所以我们只要知道一个通用方法原则就可以了,剩下的就是具体查资料了。
Schema和index一样,只能干掉,不能修改。
要想修改就得干掉然后按照你的意思来重建。
数据类型
数据类型其实只要了解就可以了。
因为主要是跟开发有关的。
下一步我就是想写关于开发的系列文章,届时再仔细介绍吧。
Numeric
数值型的数据类型可以分为以下的几种:
• Small integer (SMALLINT)
• Integer (INT or INTEGER)
• Big integer (BIGINT)
• DECIMAL/NUMERIC
• REAL/FLOAT
• DOUBLE/FLOAT
SMALLINT是占用空间最少的类型,数值范围: 32768 – 32767
SMALLINT是数值的左5位。
占据存储空间 2个字节。
INTEGER
存储空间是SMALLINT的2倍,
数值范围: 2,147,483,648 -- 2,147,483,647
是数值的左10位
占据存储空间 4个字节
BIGINT
支持64bit的整数值
数值范围: 9,223,372,036,854,775,808 -- 9,223,372,036,854,775,807
占据存储空间 8 个字节
String
这个流字串包括:
• Character (CHAR)
• Variable character (VARCHAR)
• Long variable character (LONG VARCHAR)
• Character large object (CLOB)
• GRAPHIC
• VARGRAPHIC
• LONG VARGRAPHIC
• Double-byte character large object (DBCLOB)
CHAR, 就是定长的字段, 假如我们设定的字段的长度是5,那么也假如我们输入的长度一个字段的长度是3,那么db2就会在字段的末尾添加2个空格,来凑足5个字节的长度。
定长就是节省db2的sql的处理效率,但是作为缺点就是会浪费那么一点点的存储空间,但是在我们国内的系统中,浪费确实一个不去考虑的事情,浪费在某种程度上面就是一种刺激信息化的投资,这就是某种潜现实。
CHAR最大长度是254字节,如果不指定,就是1字节。
VARCHAR
就是变长字符串的意思,
作为对比,节省空间,但是处理的成本必然有一定程度的上升,它的最大长度是表所在表空间的pagesize的大小。
VARCHAR
最根本的核心就是字段输入的多大就保存多大,不会追加空格来凑数,只要你不超过长度的硬限制。
在字符串的概念的字段的数据字段的存取范围上面,目前db2的存储的上限是32672
如果我们需要存储的数据超过了这个杠杠,
那么我们可以这样
作为xml,作为视音频,作为图片等等
这就是所谓的lob的范围
大小是 32k-2gb
Lob分为3类
• Binary large object (BLOB)
• Single-byte character large object (CLOB)
• Double-byte character large object (DBCLOB)
Blob
就是二进制格式的变长的数据格式,特别适合在数据库中存储音视频。但是这样的blob却是不能进行sort操作的。
Clob
就是单字节的变长数据格式
说白了
就是存放英文的书的。
Dbclob
就是双字节的变长的数据格式
就是我们和我们周边几个国家的文字的
比如中,日,韩等等
UDT
用户自定义类型
Db2自己已经内置了很多的数据类型,但是并不能满足我们变化的复杂的数据表达的需要
所以,db2不知道我们还需要什么样的数据类型
所以
它直接提供了一个方法和手段给我们
于是我们可以自己创建我们需要的各个数据类型
虽然
费事一点
但是中国不是有个老话说的好吗: 求人不如求己。
CREATE DISTINCT TYPE
是这个创建的语句。
DROP DISTINCT TYPE
是用户自定义类型的删除语句。
表
表就是数据库将我们实际的社会流转变成我们在我们信息流之间进行流转的重要的手段。
表表示着我们社会流的一组对象的集合。
列代表的是这些对象的共同点的属性
行是代表着这些对象中的每个的个体。
Db2中的表分为:
System catalog tables
User tables
System temporary tables
user temporary tables
System catalog tables
我们在创建了数据库之后,db2会自动创建了syscatspace,其中就是放置db2自动生成的各个catalog tables.
这些就是oracle的数据字典
这些表存储数据库各个对象的各个属性
比如:
所有的表空间,表,索引,缓冲池
所有的约束
所有的权限
等等一网打尽所有的对象信息
只有你想不到的,没有其中网不到的。
在万不得已的情况之下,请不要去更改其中的信息
否则
会严重影响db2查询优化器的数据的查询路径。
User tables
就是我们自己创建的各个表。
表的处理
Create table
Drop table
Alter table
如果我们想创建一个表a需要和b一样
我们可以如此
Create table a like b
也可以用sql的方式来达到这一目的
Create table a as (select * from b ) definition only
definition only的意思就是只是放置表结构,但是不放置数据。
我们可以用Alter table来增加列
但是db2不允许我们用Alter table来删除列
我们用2个选择
1
创建视图,逻辑上减少一个列,将我们真正的表隐藏起来
2
删除这个表,重建这个表,当然,这个似乎有点类似于说了等于没说。
表 - Default Values
这个意思是说如果一个列如此定义,那么我们在insert值得时候,如果我们不针对这个列有值得时候,那么db2会自动将这个值设置为Default Values的值。
举例来说
假如我们一个地级市要登记本行政范围之内的企业登记
那么我们可以知道
其实大部分的企业肯定是在这个地级市的市区范围,当然,下面还有县级市,但是这样一比较,县级市的数量就比较少了
我们可以将城市的Default Values值设置为这个地级市名字
那么
我们的insert语句就比较简单
程序的效率就会有所提高。
CREATE TABLE company (
companyID INTEGER,
companyName VARCHAR(30),
city VARCHAR(20) DEFAULT '扬州'
)
表 - Identity Columns
这个其实就是序列的问题
我们在一个表里面喜欢对每个个体加一个数值的号
这样
我们在以后的检索,统计或者和其他的程序的利用的时候都更为简便。
当然
这个序列是针对插入的值而言的。
Db2对于这样的事情有2种处理方式。
1
Generated always
这样的序列号只能有db2去增加,应用程序不能自己去处理。
2
Generated by default:
这个意思就是补充上面的
为我们万一想要自己的程序想要处理一下其中的序列的号提供了手段
也就是说我们可以为这个列显式地加个默认值。
如果我们的程序不显式地去加值的话,
那么db2就会根据默认值加一条
如果
我们的程序显式地指定了
那么db2就会在旁边歇着,这个列插入的值就是我们指定的。
这种方式有了一定的方便之处
但是列的序号的唯一性无法保证。
举例开始
CREATE TABLE turen (
turenno INTEGER GENERATED ALWAYS AS
IDENTITY (START WITH 200 INCREMENT BY 1),
description VARCHAR(50) )
这样的表
大家看
turenno 这个列是自动产生序号,程序无法干预,起始值=200
增量是1
然后我们试着插入
INSERT INTO turen VALUES (DEFAULT,'hhah'); --->inserts 200,
INSERT INTO turen (description) VALUES ('bbbb'); --->inserts 201,
INSERT INTO turen VALUES (300,'cccc'); --->error SQL0798N
COMMIT;
INSERT INTO turen (description) VALUES ('dddd'); --->inserts 202,
ROLLBACK;
INSERT INTO turen (description) VALUES ('fffff'); --->inserts 203,
COMMIT;
看看结果
turenNO DESCRIPTION
----------- ------------
200 hhah
201 bbbb
203 fffff
没错吧
插300的时候明显违反规则
202的时候被取消了
所以。。。。。。
我们再看另外的例子
CREATE TABLE turen (
turenno INTEGER GENERATED BY DEFAULT AS
IDENTITY (START WITH 200 INCREMENT BY 1),
description VARCHAR(50) )
这个就是说这个列可以由我们的程序来处理
起始值=200
增量=1
我们试着插入
INSERT INTO turen VALUES (DEFAULT,'aa'); --->inserts 200,aa
INSERT INTO turen (description) VALUES ('bb'); --->inserts 201,bb
INSERT INTO turen VALUES (300,'cc'); --->inserts 300,cc
INSERT INTO turen VALUES (201,'dd'); --->inserts 201,dd
COMMIT;
INSERT INTO turen (description) VALUES ('ee'); --->inserts 202,ee
ROLLBACK;
INSERT INTO turen (description) VALUES ('ff'); --->inserts 203,ff
COMMIT;
看看结果现在
turenNO DESCRIPTION
----------- ---------------------
200 aa
201 bb
300 cc
201 dd
203 ff
看
只有ee的数据被取消了
其他的,sql指定值得都进去了
不指定的
那么就是db2自己根据顺序产生的
所以
我们看到了这样的结果。
原文链接: http://www.ituren.org.cn/html/jishusuibi/200809/15-127.html
[ 本帖最后由 itubie 于 2008-9-17 13:11 编辑 ] |
|