� 将次重要数据、文件系统放在中间和边缘
2.5 2.5建库语句参考
某个数据库部分建库语句:
---创建数据库在一个2G的文件系统/anly_tag
db2 create database anly on /anly_tag alias anly using codeset gbk territory cn collate using
system
---创建bufferpool
db2connecttoanlyuserdb2admin
db2createbufferpoolTMPBF32Kimmediate size32000pagesize32k
---创建数据表空间(8G*4)并指定相应的bufferpool
db2 create tablespace TBSPANLY pagesize 32 k managed by database using (device
'/dev/ranlytbsplv' 262144)bufferpoolTMPBF32K
db2altertablespaceTBSPANLYadd(device'/dev/ranlytbsplv2' 262144)
db2altertablespaceTBSPANLYadd(device'/dev/ranlytbsplv3' 262144)
db2altertablespaceTBSPANLYadd(device'/dev/ranlytbsplv4' 262144)
---创建系统临时表空间(2G的文件系统/anly_tmp/tmp)并指定相应的bufferpool
db2createsystem temporary tablespace TBSPTMP32Kpagesize32kmanagedbysystem using
('/anly_tmp/tmp')extentsize 8prefetchsize16bufferpoolTMPBF32K
----修改日志文件大小为25000*4K
db2updatedbcfgforanlyusingLOGFILSIZ25000
db2updatedbcfgforanlyusingLOGPRIMARY20
db2updatedbcfgforanlyusingLOGSECOND50
db2updatedbcfgforanlyusingNEWLOGPATH/anly_log
----修改表空间大小
db2altertablespace tbsptempdrop(device'/dev/rdb2tbsptemp2lv')
db2altertablespace tbsptempresize(device'/dev/rdb2tbsptemp3lv' 327680)
33缓冲池和表空间
3.1缓冲池
通常,为每一页面大小的系统临时表空间建立一个缓冲池就足够了。因为在缓冲池管理
方面,我们完全可以信任DB2。如果想在这方面继续提高性能,则可以参考本节的文字。
DB2在其缓冲池的自我调优方面十分擅长,并且会将经常被访问的行放入
内存,因此一个缓冲池就足够了。(这一选择也避免了管理多个缓冲池的复杂性。)
如果时间允许,并且需要进行改进,那么可能需要使用多个缓冲池。其思想
是将访问最频繁的行放入一个缓冲池中。在那些随机访问或者很少访问的表之间
共享一个缓冲池可能会给缓冲池带来“污染”,因为有时候要为一个本来可能不
会再去访问的行消耗空间,甚至可能将经常访问的行挤出到磁盘上。如果将索引
保留在它们自己的缓冲池中,那么在索引使用频繁的时候(例如,索引扫描)还
可以显著地提高性能。
这与我们对表空间的讨论是紧密联系的,因为要根据表空间中表的行为来分
配缓冲池。如果采用多缓冲池的方法,采用4个缓冲池比较合适:
1. 一个中等大小的缓冲池,用于临时表空间。
2. 一个大型的缓冲池,用于索引表空间。
3. 一个大型的缓冲池,用于那些包含经常要访问的表的表空间。
4. 一个小型的缓冲池,用于那些包含访问不多的表、随机访问的表或顺序访问的表的表空
间。
3.2缓冲池大小
缓冲池大小需要综合考虑系统内存和服务器工作负载情况而定。通常,OLTP类型分配
75%的可用内存;OLAP类型分配50%的可用内存,将剩下的50%分配给SORTHEAP。
缓冲池对应于系统的内存空间,所以千万不要为缓冲池分配多于所能提供的
内存,否则就会招致代价不菲的OS内存分页。通常来讲,如果没有进行监控,
要想知道一开始为每个缓冲池分配多少内存是十分困难的。对于OLTP类型的工
作负载,一开始将75%的可用内存分配给缓冲池比较合适。对于OLAP/DSS,经
验法则告诉我们,应该将50%的可用内存分配给一个缓冲池(假设只有一种页面
大小),而将剩下的50%分配给SORTHEAP。
3.3表空间页大小
在页大小足以容纳一条记录的前提下,随机更新操作,倾向于用较小的页大小;而对于
一次访问大量行的操作,较大的页大小可以提供更好的性能。
为了创建一个表,必须有一个表空间,其页面大小应足以容纳一行。您可以
选择使用4、8、16或32KB这几种页面大小。有时候必须使用较大的页面大小,
以回避某些数据库管理器的限制。例如,表空间的最大尺寸与表空间的页面大小
成比例。如果使用4K的页面大小,那么表空间的大小(每个分区)最大是64GB,
如果使用32K的页面大小,那么最大是512GB。
对于执行随机更新操作的OLTP应用程序,采用较小的页面大小更为可取,
因为这样消耗的缓冲池中的空间更少。
对于要一次访问大量连续行的OLAP应用程序,通常使用较大页面大小效
果会更好些,因为这样可以减少在读取特定数量的行时发出的I/O请求的数量。
较大的页面大小还允许您减少索引中的层数,因为在一页中可以保留更多的行指
针。然而,也有例外情况。如果行长度小于页面大小的255分之1,则每一页中
都将存在浪费的空间,因为每页最多只能有255行(对于索引数据页不适用)。
在这种情况下,采用较小的页面大小或许更合适一些。
3.4系统临时表空间
为每种页面大小的表空间,建立一个系统临时表空间,通常使用文件系统,大小根据排
序和重组事物的大小确定。
对于所使用的每种页面大小,必须存在一个具有匹配页面大小的系统临时表
空间(以支持排序和重组)。然后将所有享用匹配页面大小的表空间指派给具有
相同页面大小的缓冲池。
如果对性能还有更苛刻的要求,并且有时间投入,那么可以使用DMS表空
间,并且根据使用情况来组织表。另外,还要遵循前面给出的关于使用多个缓冲
池的建议。对于每种页面大小,创建一个:
1. 系统临时表空间。
2. 用于索引的常规表空间。
3. 用于频繁访问的表的常规表空间。
4. 用于访问不多的表、随机访问的表以及顺序访问的表的常规表空间。
5. 用于LOB数据的大型表空间。
3.5区段大小和预取大小
区段大小(extentsize)和预取大小(prefetchsize)是表空间的参数,对于数据存
取性能至关重要。
区段大小跟表空间中表的平均大小有一定的比例关系,通常表越大,区段大小也越大。
如果表空间驻留在磁盘阵列上,则区段大小应设置成条纹大小。
预取大小通过公式确定:prefetch size = (# containers of the table space on
differentphysicaldisks)* extentsize。
磁盘阵列的情况:prefetchsize=extentsize*(#ofnon-paritydisksinarray)。
3.5.1 3.5.1 区段大小
extent size 指 定 在 跳到 下 一 个 容 器之 前 , 可 以 写入 到 一 个 容 器中的
PAGESIZE页面的数量,这个参数是在创建表空间时定义的(之后不能轻易修
改)。处理较小的表时,使用较小的区段效率会更高一些。
下面的经验法则是建立在表空间中每个表的平均大小的基础上的:
1. 如果小于25MB,extentsize为8
2. 如果介于25到250MB之间,则extentsize为16
3. 如果介于250MB到2GB之间,则extentsize为32
4. 如果大于2GB,则extentsize为64
对于OLAP数据库和大部分都要扫描(仅限于查询)的表,或者增长速度
很快的表,应使用较大的值。
如果表空间驻留在一个磁盘阵列上,则应将区段大小设置成条纹大小(也就
是说,写入到阵列中一个磁盘上的数据)。
3.5.2 预取大小
对于预取大小,可以通过使用ALTERTABLESPACE轻易地修改。最优设置
差不多是这样的:prefetchsize=(#containersofthe table spaceondifferentphysical
disks)*extentsize。
如果表空间驻留在一个磁盘阵列上,则设置如下:prefetchsize=extentsize*
(#ofnon-paritydisksinarray)。