DB2基础知识■目标DB2基本概念索引简介DB2应用的基本概念DB2环境介绍DB2编码规范DB2相关工具使用■关系型数据库-DB2系统架构示意OS/390CICSDB2TSODB2是OS390中的一个子系统■DB2子系统在OS/390操作系统上可同时运行多个DB2子系统,每个子系统对应一套自己的地址空间,每个DB2子系统下包含了一整套系统文件、一套系统数据库和用户定义的多个应用数据库BSDSACTIVELOGARCHIVELOG系统数据库应用数据库■DB2ObjectDB2SUBSYSTEMCATALOGDIRECTORYOTHERSYSTEMOBJECTSDATABASE1TABLESPACES1TABLESPACES2TABLE1TABLE2.etc.INDEX1INDEX2.etc.VIEW1VIEW2VIEW3.etcDATABASE2.etc.STORAGEGROUP1VOLUME1VOLUME2STORAGEGROUP2VOLUME3■DB2Objects概述CATALOG:DB系统定义信息DIRECTORY:DB系统管理信息ACTIVELOGANDARCHIVELOG:日志和存档日志DATABASE:逻辑数据库定义TABLESPACES:定义数据库表的物理存放STORAGEGROUP:定义物理卷空间分配TABLE:关系数据库的基本表INDEX:建立在TABLE上的索引VIEW:视图,建立在TABLE上的虚表■DataBase一系列DB2数据库的组织和结构称为DATABASE;是tables和相关indexes的最终集合,也是用于存放所有TABLESPACE,INDEXSPACE的区间名称DATABASETABLESPACETABLEINDEXSPACEINDEX■STOGROUPSTORAGEGROUP一组VOLUME的集合,在定义TABLESPACE和INDEXSPACE时指定IndexSpaceSTOGROUPTableSpaceTableSpaceTableSpaceIndexSpaceIndexSpace■TABLESPACE存放一个或多个TABLE内容的一个或多个DATASET,对应具体的VSAM文件,指定DATABASE和STORAGEGROUP,TS由大小相同的PAGE组成,缺省值为4KTableTableTableTABLESPACEVSAMLINEARDATASET■页Page一个TABLESPACE由有连续编号的pages组成。在DB2的中,PAGE是最小的存储单元,也是I/O的基本单位,可以逻辑地划分为4K、8K、16K、32K;TABLE中的一行(ROW)必须存放在单个PAGE中,一个PAGE中可以存放多行在资源管理中,Tablespaces,table,page或row都可以作为资源锁的单元■SimpleTableSpace能包含多个表,但是各个表的记录不是分开存放的,一个PAGE可包含多个表的记录要SCAN一个table的所有记录需要对整个tablespace进行扫描;当一个表被DROP掉后,它所占用的空间不会立即被释放掉;如果申明LOCKTABLE,整个TABLESPACE会被锁住。pagepagepageTB1TB2pagepagepageSimpleTablespace■SegmentedTableSpace一个SegmentedTableSpace可包含多个表,DB2以SEGMENT为单位为表分配空间,每个段只存放同一个表,但一个表所在的多个SEGMENT不一定是连续的。对一个table进行scan时,只有该table所在的segment会被scan;当对一个table加锁时,其它表不会受影响;当一个table被drop后,它之前所占的空间会立即释放pagepagepageTB1TB2pagepagepageSegmentedTablespace■PatitionedTableSpace一个PartitionedTableSpace只包含一个表(partitionedtable)根据INDEX的范围将表的存储空间划分成几个部分,每部分对应一个物理的数据集.这个index叫做该表的partitionedindex,一个partitionedtable对应唯一的partitionedindex,允许SQL和utilities同时访问不同的partitionspagepagepagepagepagepageTBPatitionedTablespace■分区索引PatitionedIndexpagepagepagepagepagepagePatitionedTablespace分区索引TB分区索引分区索引Patitionedindex0000—0299:北京地区0300—0399:天津地区0400—0499:河北地区■分区表空间某个分区可以STOP,不影响其它分区上例中,STOP0300—0399:天津地区有交易查询:WHEREZONENO=200因没有涉及到0300-0399分区,查询交易仍然可以成功■PARTITION表划分原则数据量过大的表(超过2G)并行批量程序涉及的表■并行批量并行批量程序处理的单元是批量单位,一个批量单位对应一个或多个地区,如果批量访问的表没有划分PARTITON,则在一个PAGE里会出现不同地区的数据(如下图):地区2地区3地区1PAGE2地区1地区3地区8PAGE3地区1地区2地区4PAGE1■并行批量情况一:处理地区1数据的批量程序开始运行,它请求获得PAGE1的数据,对PAGE1加了X-LOCK,这时处理地区2或地区4数据的程序对PAGE1的请求处于等待状态,直至PAGE1的X-LOCK被释放掉.而批量程序一般是多笔COMMIT一次,则处理地区2或地区4的程序很有可能发生等待超时。造成TIMEOUT。情况二:如果处理地区1数据的程序获得PAGE1并等待处理PAGE2的数据;同时处理地区2数据的程序获得PAGE2并等待处理PAGE1的数据,则此时会出现DEADLOCK。对并行批量程序涉及的表进行PARTITON划分,使不同地区的数据按照一定区间分开存放可避免上述两种情况(TIMEOUT和DEADLOCK)的发生。■PARTITIONTABLESPACE的缺点PARTITIONINDEX要通过DROPTABLESPACE才能被DROP掉;PARTITIONINDEX中定义的VALUES(区间范围)不能被更改。若要更改,则需重建整个TABLESPACEPARTITION数目不能更改,若要更改,则需重建整个TABLESPACE.因此在定义PARTITION表时应估算好PARTITION的数目,最大可定义254个。一个PATITIONTABLESPCE对应多个数据文件,PARTITION的数目越多的话,我们在访问数据时打开的DATASET就会越多,这一方面会给OPEN/CLOSE动作带来额外的CPU开销,另一方面也需要额外的VIRTUALSTORAGE。再则,数据库在建立时有个参数DSMAX指定该数据库可同时打开的DATASET的数量,同时打开的DATASET过多,可能达到这个限制。需要增大BUFFERPOOL,SORTPOOL,WORKFILE来支持并行。■DB2数据库的基本建立过程建立存储组(StorageGroup);建立逻辑数据库(DataBase);定义表空间(Tablespace);建立表(Table);在表的基础上建立索引(Index);装载、处理数据(Load/Insert);■建立索引的优点一般来说,建立INDEX有以下益处:提高查询效率;建立唯一索引以保证数据的唯一性;设计INDEX避免排序。■建立索引的缺点而INDEX的维护又有以下开销:叶节点的‘分裂’消耗;INSERT、DELETE和UPDATE操作在INDEX上的维护开销;有存储要求;其他日常维护的消耗:对恢复的影响,重组的影响。■需要建立索引的情况为了建立分区数据库的PATITIONINDEX必须建立为了保证数据约束性需要而建立的INDEX必须建立。为了提高查询效率,则考虑建立(是否建立要考虑相关性能及维护开销)考虑在使用UNION,DISTINCT,GROUPBY,ORDERBY等字句的列上加索引■RID索引的叶子中的指针被称为“记录RID”或RID每个RID是表空间的页号和数据值行指针的组合,由RID可以准确地找到表中对应的记录。当DB2通过索引来查找数据时,会先查找索引,得到需要查询记录的RID,然后根据RID访问数据页■群集索引与非群集索引PatitionedIndex是ClusterIndex数据页数据页数据页数据页索引数据群集索引ClusterIndex数据页数据页数据页数据页非群集索引NonclusterIndex■ClusterRatio索引的群集化有一个指标来表示,即ClusterRatio群集索引的ClusterRatio都较高。一般来说,某个表的几个索引,定义较重要的那个为ClusterIndex。所有索引的ClusterRatio值都存储在系统表中,位于SYSIBM.SYSINDEXES,可以用下列语句将其查出:SELECT*FROMSYSIBM.SYSINDEXES某个表几个索引的ClusterRatio一般相差较大数据页中的数据只有一种排列方式,不可能符合所有索引的排列。■FilterFactor根据某个列的条件可以过滤掉出来的记录数,称为过滤因子FilterFactor对上例,编目统计信息中FIRSTKEYCAR=20,DB2认为地区号有20个,根据地区号可以过滤出来1/20的记录,则ZONENO=?条件的过滤因子就是1/20编目信息不足时DB2会采用默认值过滤因子越小越好where条件中用AND时小的过滤因子放在前面,可以减少后面条件处理的记录数目用OR连接时恰好相反,过滤因子大的放在前面,让DB2先尽可能多取出数据■预取PrefetchNORMALREAD:当读取一个或少数几个连续的页时,DB2采用NORMALREAD方式,每次传输的单位是一个页PREFETCH:DB2通过一次异步的I/O操作,将若干数据页读入BUFFERPOOL。减少I/O次数,提高I/O效率,通过CUP与I/O的异步处理,节约处理时间■顺序预取SEQUENTIALPREFETCH用于读取连续的页既可用于在TABLESPACESCAN中访问连续的数据页,也可用于在INDEXSCAN中访问连续的数据页和索引页页单个I/O页页页页页页页页页页页页页页页页单个I/O常规I/O一次发生一页顺序预取单个I/O一次最多获得32页页页页页页页页页页页页页页页页页■列表预取ListPrefetch根据单个索引来访问数据且ClusterRatio不高;或根据多个索引访问如按索引序顺来读TableSpace,如图,可能读数据页1-3-2-4-1-3……造成重复读某一数据页先将索引RID排序,产生listofRID按listofRID顺序读页,不会重读数据页1数据页2数据页3数据页4■可索引谓词IndexablePredicate所有的可索引谓词都是阶段1谓词,但反之却不是这样我们常用的可索引谓词有COLUMN_NAMEoperatorvalueCOLUMN_NAMEBETWEENval1ANDval2COLUMN_NAMEIN(listofcolumns)其中的operator我们可以用=、=、=、、来代替,而不能用来代替■匹配索引扫描MATCHINGINDEXSCAN谓词指定在一个索引的全部列,或是从索引第一个列开始并在该索引中连续的列上区配的索引字段前几列用等于或IN,最后一个可以是范围谓词(,,=,=)MATCHINGCOLUMNS:匹配的字段数