版权声明:
本文可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息。
原文出处: http://www.aiview.com/notes/db2_note.htm
作者: 张洋 Alex_doesAThotmail.com
最后更新: 2004-8-5
目录
在DB2中有关实例(Instance), 数据库(Database),表空间(TableSpace),容器(Container)等概念:
在一个操作系统中,DB2数据服务可以同时运行多个实例(有别于Oracle在一个系统内只能起一个实例),数据库定义在实例中,一个实例可以包含多个数据库。在同一个实例中的不同数据库是完全独立的,分别拥有自己独立的系统编目表。
表空间分为DMS方式和SMS(System manegement Space)方式,定义在数据库中,一个数据库中必须存在两个系统基本的表空间,分别是系统编目表空间(SysCatSpace)与系统临时表空间(SysTempSpace)。在数据库中创建的任何对象都以在系统编目表空间中增加记录的方式体现,对于临时表空间,其占用磁盘大小是根据使用情况动态伸缩的,即仅在需要时才分配磁盘空间,并在使用后进行回收。此外,若用户需要创建表,则需要创建用户表空间(UserSpace),若需要使用临时表,则需要创建用户临时表空间(UserTempSpace)。
DMS与SMS类型在表空间建立时指定,建好后不能转换。对于DMS方式,一个表空间对应了一个或多个容器(Container),容器指定了数据的物理存储位置。对于SMS方式,只能够指定一个目录,不能够增加。
容器分为三种类型,前两种是文件与设备,用于DMS方式的表空间;还有一种是目录,用于SMS方式的表空间,此种方式不需要人工管理数据存储文件,DB2可根据情况在目录中自动增加存储文件,只要磁盘空间允许。实质上,表空间是数据存储的逻辑位置定义,容器则是数据存储的物理位置定义。
影响一个数据库的性能主要有以下因素:磁盘(Disk), 内存(Memory),
处理器(CPU), 网络(Network)。其中以磁盘最为显著,90%的性能瓶颈可能来自于磁盘的IO竞争;其次是内存,一方面是指物理内存的总量要满足需求,另一方面是指与内存相关的配置参数应正确配置;当然处理器的性能也很重要,多路CPU会对哪些依赖计算能力的复杂SQL查询起到显著的效果;网络不属于主要因素,属于客观的环境因素,是指过慢的网速会对数据的传输造成影响。以下列出一些对于提高数据库性能有效的方法:
对于运行数据库服务的服务器可以尽可能的配置多块物理磁盘,每块的容量不必太大,这样可以有效的分担数据存储与读取操作过程的磁盘IO竞争。即采用多块小容量的磁盘在性能上要优于仅采用一块大容量的磁盘。
如果条件允许,尽量使数据存储服务与操作系统分别运行在物理分开的磁盘上。
采用DMS(Database Management Space)管理方式的表空间。
在物理不同的磁盘上创建多个表空间。然后可以将数据和索引分别存放在不同的表空间,这样可以显著的提高性能。还可以把一个使用频繁的大表纵向拆成多个小表,分别存放在不同的表空间中,然后用一个视图进行联合。
DB2服务器可以管理裸设备,即除系统以及DB2服务运行磁盘以外,为DB2数据存放单独准备磁盘,可以是多块,分区后不需要格式化,创建裸设备后直接交给DB2进行管理,用于存储数据。
系统的临时表空间对数据库性能影响很大,当由管理的物理内存不能满足数据库操作的需要时,DB2便会把临时数据写到磁盘上,这时便用到了系统临时表空间,并且这种情况会经常发生。
尽量在磁盘靠近最内层磁道的位置安放数据,因为此处磁盘的访问速度较快。
DB2的参数配置分为两个级别,一个是实例级别,另一个是数据库级别。对数据服务性能影响较大的参数主要在数据库级别配置。以下是三个比较重要的内存配置参数:
bufferpage: 由同一个数据库中的所有对象共享。
sortheap:
用于排序的内存交换区,非共享,不宜设置太大,否则,很容易引起内存耗尽,因为每一个事务都会申请独立的内存用于排序。
locklist:
共享内存,用于记录数据服务运行中建立的锁。建议设置20Mb左右,需要时根据实际情况进行调整。DB2默认使用行级锁,如果设置太小,当锁的记录太多时,则会导致内存不足,此时DB2会把多个行锁升级为一个表锁,这样就会大大降低应用程序的并发性能。如果设置太大,则多分配的内存很少会被用到,导致浪费。
其他的一些配置参数:
numdb: 同时可以启动的实例数目
DB2的常用命令:
db2ilist 列出当前系统中定义的DB2实例
daslist 列出系统中的DAS
db2 list database directory 列出当前实例中定义的数据库
db2 list tablespaces 列出当前数据库中定义的表空间
db2 list tabses [for all] 列出当前数据库中的表
db2 list active db 列出活动的数据库
db2 get dbm config
get db cfg for databasename
db2 update db cfg for databasename using bufferpage 600M
db2 alter bufferpool IABMDEFAULTBP size =1
db2 list applications show detail
以上命令可以在后面加 " show detail"
参数,显示详细信息。
DB2数据存储的页大小只能在表空间级别统一指定(区别于Oracle,可以定义在表级别),
并且建好后不能修改。
可以手工建立一个页大小为4K的DMS用户临时表空间,然后把系统默认的SMS系统临时表空间删除。为满足应用需求,一般还应再建立一个页大小在8K以上的用户临时表空间。
DB2 UDB V8.1 对RedHat Linux 9 的支持不好,默认情况下无法启动GUI安装程序(可以通过设置环境LD_ASSUME_KERNEL=2.2.5解决),并且不会安装Sample数据库,控制中心也无法正常启动。
当使用COUNT()函数时,如果表中的记录数 > 2 147 483 647行,则函数可能返回错误的结果,这时可以使用返回类型为DECIMAL(31,
0)的COUNT_BIG()函数。
DISTINCT 关键字可以用在COUNT()函数中,如:SELECT COUNT(DISTINCT id)
FROM TABLE,这代表将不对id列的重复值进行计数。
ORDER BY子句后面如果写了多个列名,需要分别指定升序或是降序。
可以在load大量数据时,暂时关闭表的日志选项。使用:ALTER
TABLE ... ACTIVATE NOT LOGGED INITIALLY
DB2的几个特殊寄存器:CURRENT DATE, CURRENT TIME, CURRENT TIMESTAMP,
USER(用户ID).
有关日期的操作:CURRENT TIMESTAMP + 2 DAYS(or HOURS, SECONDS, MONTHS,
YEARS, etc.)
case 语句的使用:case when 条件一 then 动作一 else 动作二 end;
可以欠套使用。
在视图的创建语句中无法使用order by 子句与 fetch n rows
子句。但对于order by可以用如下方法替代实现,不过会影响效率。
create view v_name1(c1, c2, c3) as
select * from (
select column1, column2, column3
from t1
order by column1 ) as t1;
参考资源
IBM DB2 开发者园地
http://www-900.ibm.com/developerWorks/cn/dmdd/certify/index.shtml
IBM DB2 信息中心
http://publib.boulder.ibm.com/infocenter/db2help/index.jsp
dbforums 论坛
《DB2 UDB v8.1 for Linux, UNIX, Windows 数据库管理》George
Baklarz, Bill Wong 合著,机械工业出版社出版
《DB2数据库管理与应用教程》庄济诚
著,清华大学出版社出版