首页 第05章 物理数据库设计.doc

第05章 物理数据库设计.doc

举报
开通vip

第05章 物理数据库设计.doc第05章 物理数据库设计.doc 第5章 物理数据库设计 上一章介绍DB2数据库的逻辑设计。数据库实施总共有5个阶段:需求分析、逻辑设计、实现设计、物理设计以及实施与维护。在完成逻辑数据库设计之后,应当考虑数据库和表驻留在其物理环境的诸多因素,这包括了解要创建哪些文件以支持和管理数据库、了解存储数据需要多大空间以及确定如何利用存储数据所需要的空间。这就是说数据库的物理设计开始了。数据库的物理设计是将数据库的逻辑模型转换为特定计算机系统支持的数据库结构,它包括逻辑结构和物理结构两个部分。因此,物理设计时必须考虑具...

第05章 物理数据库设计.doc
第05章 物理数据库 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 .doc 第5章 物理数据库设计 上一章介绍DB2数据库的逻辑设计。数据库实施总共有5个阶段:需求分析、逻辑设计、实现设计、物理设计以及实施与维护。在完成逻辑数据库设计之后,应当考虑数据库和表驻留在其物理环境的诸多因素,这包括了解要创建哪些文件以支持和管理数据库、了解存储数据需要多大空间以及确定如何利用存储数据所需要的空间。这就是说数据库的物理设计开始了。数据库的物理设计是将数据库的逻辑模型转换为特定计算机系统支持的数据库结构,它包括逻辑结构和物理结构两个部分。因此,物理设计时必须考虑具体计算机硬件及操作系统的约束,其主要内容是选择数据的存储结构与检索方法,并根据设计结果修改和完善程序的编写说明。本章主要介绍DB2的物理数据库设计,理解这些设计方法,就可以设计出物理上性能优良的DB2数据库DB2。本章主要内容包括: , 数据库目录和文件 , 数据库对象的空间 要求 对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗 , 系统类表的空间需求 , 用户表数据的空间需求 , 长整数字段数据的空间需求 , 大对象数据的空间需求 , 索引的空间要求 , 日志文件的空间需求 , 临时表的空间需求 , 数据库分区组 , 数据库分区组设计 , 分区映射 , 分区关键字 , 表并置 , 分区兼容性 , 复制实体化查询表 , 表空间设计 , 系统管理空间 , 数据库管理空间 , 表空间映射 , 如何在DMS表中添加和扩展容器 , 如何在DMS表中删除和减少容器 , SMS和DMS表空间的兼容性 , 表空间磁盘I/O , 在表空间设计时的负载考虑 , 度大小 , 表空间和缓冲池的关系 , 临时表空间设计 , 类目表空间设计 , 当数据在RAID设备上的时候,优化空间性能 , 当选择表空间的时候需要考虑的事项 5.1 数据库目录和文件 当创建一个数据库时,DB2会创建一个单独的子目录来存储控制文件,如日志文件,并将容器分配给默认的表空间。与该数据库相关的对象并非始终存储在该数据库目录中,它们可以存储在不同的位置/设备。 在DB2INSTANCE环境变量定义的实例中创建数据库,或者在已使用ATTACH命令显式连接的实例中创建数据库。 在UNIX系统平台上其命令格式如下: specified_path/$DB2INSTANCE/NODEnnnn/SQLSQL00001 在OS/2和Windows操作系统平台上其命令格式如下: E:\$DB2INSTANCE\NODEnnnn\SQL00001 其中,参数说明如下: , specified_path表示用来安装该实例的用户可选的路径。 , NODEnnnn表示分区数据库环境中的节点标识符。第1个节点是NODE0000。 , “E:”表示标识根目录所在的卷的“盘符”。 SQL00001包含与创建的第一个数据库相关的对象,并给予后续数据库更大的数字SQL00002,以此类推。 在与数据库管理程序实例同名的目录中创建子目录,在创建数据库时连接该实例。在OS/2和Windows操作系统平台上,可以在“盘符”标识的卷的根目录下创建其子目录。在CREATE DATABASE命令所指定的路径中创建这些实例和数据库子目录,并且数据库管理程序会自动维护它们。每个实例可能被一个实例拥有者占有,这取决于用户所用的平台。该拥有者对该实例对应的数据库具有系统管理员(SYSADM)的权限。要避免潜在的问题,不能创建以相同模式命名的目录,不能对数据库管理程序已创建的目录进行操作。 与数据库有关的文件包括下面这些文件。 , SQLDBCON:此文件存储数据库的调整参数和标识。 , SQLOGCTL.LFH:此文件有助于跟踪和控制所有数据库日志文件。 , Snnnnnnn.LOG:数据库日志文件,nnnnnnn编号从0000000到9999999。这些文件 的编号由logprimary和logsecond数据库配置参数控制。个别文件的大小由logfilsiz 数据库配置参数控制。通过使用循环记录,可重新使用这些文件,并且保持相同的 编号。通过使用归档记录,当将日志归档并分配新日志时,文件编号将依次增加, 当达到9999999时,该编号从头计数。默认情况下,这些日志文件存储在SQLOGDIR 目录中,SQLOGDIR位于SQLnnnnn子目录中。 , SQLINSLK:此文件帮助确保数据库只由数据库管理程序的一个实例使用。 , SQLTMPLK:此文件帮助确保数据库只由数据库管理程序的一个实例使用。 , SQLSPCS.1:此文件包含该数据库中所有表空间的定义和当前状态。 , SQLSPCS.2:此文件是SQLSPCS.1的版本。若没有这两个文件中的任何一个,那 么就不能存取用户的数据库。 , SQLBP.1:此文件包含数据库中所使用的所有缓冲池的定义。 , SQLBP.2:此文件是SQLBP.1的副本。若没有这两个文件中的任何一个,那么就不 能存取用户的数据库。 , DB2RHIST.ASC:此文件是数据库历史文件,它保存对数据库执行的管理操作的历 史记录,如备份和复原操作。 , DB2RHIST.BAK:此文件是DB2RHIST.ASC的副本。 不能直接修改这些文件。只能使用API和实现API的工具如命令行处理器和控制中心来间接存取这些文件。 , 不能移动这些文件。 , 不能删除这些文件。 , 备份数据库或表空间唯一支持的方法是通过sqlubkp(备份数据库)API和该API 的命令处理器以及控制中心来实现。 5.2 数据库对象的空间要求 数据库对象的空间估计不可能做得很精确。磁盘碎片、空闲空间和使用变长列所造成的额外开销都使得空间估计显得十分困难,因为可能出现的列类型和列长度的范围实在是很广。一般地,初步估计数据库的空间之后,就要创建一个测试用的数据库,并用具有代表性的测试数据填充这个数据库。 在控制中心,可存取许多专门辅助用户确定各种数据库对象的空间要求的应用程序。 , 按照下面的步骤,可以在DB2中估算一个数据库对象(如一个表)的空间。 (1) 展开“控制中心”窗口中的对象树,单击【表】文件夹,如图5-1所示。 图5-1 单击【表】文件夹 (2) 在“控制中心”窗口右边窗格列出的表对象中,右击要查看的选项,在弹出的快 捷菜单中选择【估计大小】命令,如图5-2所示。 图5-2 选择【估计大小】命令 (3) 等几秒钟文件载入过程之后,会弹出“估计大小”对话框,如图5-3所示,填写此 对话框并单击【运行统计】按钮。 图5-3 填写“估计大小”对话框 (4) 在“运行统计”对话框中选择自己需要的选项,然后单击【确定】按钮,既可以 在“估计大小”对话框中显示出估算项的大小,如图5-4所示。 图5-4 估算项的大小 , 按照下面的步骤,可以通过“显示相关的”对话框来确定对象之间的关系。 (1) 展开“控制中心”窗口中的对象树,单击【表】文件夹,如图5-1所示。 (2) 在“控制中心”窗口右边窗格列出的表对象中,右击要查看的选项,在弹出的快捷 菜单中选择【显示相关的】命令,如图5-5所示。 图5-5 选择【显示相关的】命令 (3) 在打开的“显示相关的”对话框中查看相关信息,如图5-6所示。 图5-6 查看相关信息 , 按照下面的步骤,可以选择实例中的任何一个数据库对象,比如表,然后请求生成 DDL。 (1) 展开“控制中心”窗口的对象树,单击【表】文件夹,如图5-1所示。 (2) 在“控制中心”窗口右边窗格列出的表对象中,右击要查看的表项,在弹出的快捷 菜单中选择【生成DDL】命令,如图5-7所示。 图5-7 选择【生成DDL】命令 (3) 在打开的“Generate DDL-Table list”对话框中选择相关选项,如图5-8所示。然后 单击【生成】按钮或【显示命令】按钮。也可将生成的SQL语句或命令作为脚本 文件保存,以便于今后使用。 图5-8 “Generate DDL-Table list”对话框 (4) 如果单击【生成】按钮,系统会提示用户输入口令。之后,就可以到系统提示的目 录中查看所生成的文件,如图5-9所示。 图5-9 生成DDL 在以上任何一种情况中可以按【Show SQL】按钮或【Show Command】按钮。所有这 些工具都有在线帮助,来辅助用户操作。 另外,估计数据库的空间时,必须考虑以下情况的影响。 , 系统类目表 , 用户表数据 , 长整数字段数据 , 大对象 (LOB) 数据 , 索引空间 , 日志文件空间 , 临时工作空间 还有下面的相关需求: , 本地数据库目录文件 , 系统数据库目录文件 , 操作系统所需的文件管理: , 文件块大小 , 目录控制空间 5.3 系统类目表的空间需求 DB2系统类目被认为是一个核心知识库,它记录着对象、授权、支持通信和操作DB2所要用的信息,在DB2家族的各个成员中系统类目会有一些不同,但它们都完成相同的功能。系统类目是由几个DB2表组成,并通过SQL来访问。系统类目中包含许多详细信息,如DB2对象在创建或修改对象时的数据定义语言(Data Definition Language,DDL)信息或给一个或一组对象授权时的数据控制语言(Data Control Language,DCL)信息。 创建数据库时,会创建系统类目表,如图5-10所示。当将数据库对象和特权添加到该数据库时,这些系统类目表的空间将会变大。最初这些系统类目表大约要使用3.5MB的磁盘空间。 图5-10 系统表 为系统类目表分配的空间容量取决于表空间的类型和包含这些系统类目表的表空间的数据块的大小。例如,如果要使用数据块大小为32的DMS表空间,那么系统类目表空间最初将被分配20MB的空间。 对于含有多个分区的数据库,系统类目表只能驻留在发出CREATE DATEBASE命令的分区上,系统类目表的磁盘空间仅仅对该分区来说才是必需的。 5.4 用户表数据的空间需求 在默认情况下,表数据存储于4KB的页上。不管每页的大小如何,每一页都包含76个字节的数据库管理程序所需的额外空间开销。虽然4KB的页上行的长度不能超过4005个字节,这就留下了4020个字节,来存放用户数据。一行不能横跨多个页。当使用4KB大小的页时,最多可容纳500列。 表数据页不包含使用LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB或DBCLOB数据类型定义的列的数据。但是,一个表数据页中的行确实包含这些列的描述符。 当向表中插入行时,通常系统使用空闲空间来映像搜索文件,要查找大小足以存放该新行的第一个可用空间。更新一行时,就在原位置上更新,除非该页上所剩的空间不足以容纳新数据。如果所剩空间不足以容纳新行,就要在原来的行位置创建一条记录,来指到更新之后的行在表文件中的新位置。如果调用ALTER TABLE APPEND ON语句,就将一直追加数据,并且不会保留有关数据页上任何空闲空间的信息。 对于数据库中的每个用户表,可以通过如下计算公式来估计4KB页数。 ROUND DOWN (4020 / (平均行大小 + 10)) = records_per_page 然后,将结果插入以下公式: (number_of_records / records_per_page) * 1.1 = number_of_pages 其中,平均行大小是平均列大小的总和,而乘数1.1表示额外开销。此公式只提供一个估计值。若记录长度由于碎片和溢出记录而改变,那么估计的准确性就要降低。 也可以选择创建具有8KB、16KB或32KB大小的页的缓冲池或表空间。所有在特定大小的表空间中创建的表都具有匹配的页大小,如图5-11所示。假设使用32KB的页大小,那么单个表或索引对象的最大大小可达512GB。当使用8KB、16KB或32KB的页大小时,最多可有1012列。对于4KB的页大小,最大列数为500。最大行长度也随也页大小的不同而不同。 图5-11 用户表空间 , 当页大小为4KB时,行长度最大可为4005字节。 , 当页大小为8KB时,行长度最大可为8101字节。 , 当页大小为16KB时,行长度最大可为16293字节。 , 当页大小为32KB时,行长度最大可为32677字节。 拥有更大的页大小有助于减小任何索引中的级别数。若使用执行随机行读写的联机事务处理(OLTP)应用程序,那么页面小一点会更好,这样,由于不期望的行而浪费的缓冲空间更少。若使用一次存取大量连续行的决策支持系统(DSS)应用程序,那么页大一些会更好,这样可以减少读取特定行数所需要的I/O请求数。当行大小小于页大小除以255的值时,会发生异常。在这种情况下,每页都会有浪费的空间。为减少浪费的空间,页面小一些或许更合适些。不能把备份复原为另一种页大小,也不能调入超过755列的IXF数据文件。每页最多只能有255行。 已说明只能在用户临时表空间类型的表空间中创建临时表。不存在默认的用户临时表空间。临时表不能含有长整数类型数据。当应用程序与数据库断开连接时,就隐式卸载该表,估计它们的空间需求时应该考虑这一点。 5.5 长整数字段数据的空间需求 长整数字段数据存储在一个单独的表对象中,它的结构与其它数据类型不同,如图5-12所示。数据存储在32KB区域中,该区域被分成大小为512字节的2的幂之多的段。因此,这些段可以有512个字节、1024个字节、2048个字节,依此类推,直到32700个字节。长整数字段数据类型(LONG VARCHAR或LONG VARGRAPHIC)更便于空闲空间以易于回收的方式存储。有关分配和空闲空间的信息存储在4KB分配页中,它在整个对象中不经常出现。对象中未使用的空间数量取决于长整数字段数据的大小以及此大小在该数据的所有出现之处是否都是不变的。对于大于255个字节的数据项,这个未使用的空间最大可为该长整数字段数据大小的50,。 长整数数据 表空间选项 图5-12 长整数数据表空间 如果该字符数据的长度小于页的大小,并且它适合于该数据其余部分的记录,那么应该使用CHAR、GRAPHIC、VARCHAR或VARGRAPHIC数据类型,而不要使用LONG VARCHAR或LONG VARGRAPHIC数据类型。 5.6 大对象数据的空间需求 大对象数据存储在两个单独的表对象中,这两个对象的结构与其它数据类型对象不同,如图5-13所示。要估计大对象数据所需的空间,需要考虑用来存储按照这些数据类型定义的数据的两个表对象。 图5-13 大对象数据类型的PICTURE字段 , 大对象数据对象: 数据存储在64MB区域中,该区域被分成大小为1024个字节 的2的幂这么大的段。因此,这些段可以有1024字节、2048个字节、4096个字节, 依此类推,直到64MB。要减少大对象数据所用的磁盘空间量,就要在CREATE TABLE和ALTER TABLE语句中的大对象选项子句中使用COMPACT参数。 COMPACT参数将所需的磁盘空间量降到最小,其方法就是把大对象数据分成更小 的段。这个过程不涉及到数据压缩,只是使用最接近1KB极限的最小空间量。使 用COMPACT参数可能导致在追加大对象的值时性能下降。包含在大对象数据对 象中的空闲空间量将受更新和删除活动以及插入的大对象的值大小的影响。 , 大对象分配对象: 有关分配和空闲空间的信息存储于和实际数据分离的4KB分配 页中。这些4KB页的数目取决于数据量,包括为大对象数据分配的还没有使用的 空间。额外开销的计算方法如下:每64GB一个4KB页加上每8MB一个4KB页。 若该字符数据的长度小于页的大小,并且它适合含有该数据其余部分的记录,那么应该使用CHAR、GRAPHIC、VARCHAR或VARGRAPHIC数据类型,而不要使用BLOB、CLOB或DBCLOB数据类型。 5.7 索引的空间要求 对于每个索引,可以按如下公式估计所需的空间,如图5-14所示。 (平均索引关键字大小,8)×行数×2 其中,平均索引关键字大小是索引关键字中每列的字节计数,乘数“2”表示额外开销,如非叶子页和空闲空间。 对于允许NULL的每个列,添加一个额外的字节来表示该空值指示符。 图5-14 索引空间的估计 创建索引时,临时空间是必需的。在创建索引期间所需的最大临时空间可以按照如下公式估计。 (平均索引关键字大小,8)×行数×3.2 其中,乘数3.2表示索引额外开销,以及创建索引期间进行排序所需的时间。 对于非唯一索引,存储重复的关键字项只需4个字节。上面显示的估计只是假定没有重复项的情况,因此以上公式可能会过多估计存储索引所需的空间。 可使用下面两个公式来估计叶子页的数目,其中叶子页就是存储一定量数据的内存页,第2个公式可以提供更准确的估计。这些估计的准确度很大程度上取决于平均值反映实际数据的准确程度。 对于SMS,所需的最小空间为12KB。而对于DMS,最小值是一个数据块。 1. 每个叶子页的平均关键字数的粗略估计如下。 .9,U,M,2,D,1,,,,,,,, ,,K,6,4,D 其中参数的含义如下: , U表示一页上的可用空间,大约等于页大小减去100。对于4096的页大小,U的值为 3996。 , M = U / (8 + 最小关键字大小)。 , D = 每个关键字值的平均重复项数。 , K = 平均关键字的大小。 记住最小关键字大小和平均关键字大小必须有一个额外字节,表示每个可空关键字部分;还必须有一个额外的字节,表示每个变长关键字部分的长度。若存在包括列,然后在计算最小关键字大小和平均关键字大小时应将它们考虑在内。若在创建索引期间指定了非默认 值10%的一个空闲百分比,那么就可以使用任何 (100 , pctfree)/100替换9。 2. 每个叶子页的平均关键字数的更准确估计如下。 L=叶子页数=X / (叶子页上的平均关键字数) 其中,X是表中的总行数。可按照如下方法估算索引的原始大小。 ( L + 2 L / (叶子页上的平均关键字数))×页大小 对于DMS表空间,把一个表上所有索引的大小加在一起,然后四舍五入为该索引所在表空间的数据块大小的一个倍数。应该为INSERT / UPDATE活动所引起的索引增长提供附加空间,这种增长可能导致分页。 使用下列计算方法来获得更精确的原始索引大小的估算值,以及该索引中级别数的估算值。若索引定义中使用包括列,可能要引起特别注意。每个非叶子页的平均关键字数大约如下。 .9,U,M,2,D,1,,,,,,,, ,,K,12,8,D 其中参数的含义如下。 , U表示一页上的可用空间,U大约等于页大小减100。对于4096的页大小,U是3996。 , D是在非叶子页上每个关键字值的重复值的平均数目,这将比在叶子页上的小得多,用 户可能想将该值设置为0,以便于简化计算。 , M = U / (8 + 非叶子页的最小关键字大小)。 , K = 非叶子页的平均关键字大小。 只要没有包括列,非叶子页与叶子页的最小关键字大小和平均关键字大小将是相同的。包括列不存储在非叶子页上。除非(100 - pctfree)/100大于.9,否则不应使用它来替换.9,因为在创建索引期间会在非叶子页上留下10,的空闲空间。可用如下所示的方法估算非叶子页数。 if L > 1 then { P++; Z++; } While (Y > 1) { P = P + Y Y = Y /N Z ++ } 其中参数的含义如下。 , P是页数,最初为0。 , L是叶子页数。 , N是每个非叶子页的关键字数。 , Y = L / N。 , Z 是索引树中的级别数,最初为1。 总页数如下。 T = (L + P + 2) × 1.0002 附加的0.02,表示额外开销,包括空间映像页。 创建索引所需的空间容量估算如下。 T × 页大小 5.8 日志文件的空间需求 日志文件空间和临时工作空间需要附加空间。 日志文件所需的空间量(以字节数计),其范围可以是:(logprimary×(logfilsiz,2)×4096) ,8192至((logprimary,logsecond)×(logfilsiz,2)×4096),8192。 其中参数的含义如下。 , Logprimary是在数据库配置文件中定义的主日志文件数。 , Logsecond是在数据库配置文件中定义的辅助日志文件数。 , Logfilsiz是在数据库配置文件中定义的每个日志文件中的页数。 , 2是每个日志文件所需的标题页的数目。 , 4096是一页中的字节数。 , 8192是日志控制文件的大小(以字节计)。 总的活动日志空间不能超过32GB,日志文件如图5-15所示。 图5-15 日志文件 日志文件空间上的上限取决于数据库管理程序在运行时所需要的辅助日志文件的实际 数目。这个上限可能永远不需要,或者可能只在偶尔活动拥挤时才用得上。 若允许对该数据库执行前滚恢复,应该考虑特殊的日志空间需求。 , 当启用logretain配置参数时,日志文件将被归档在日志路径目录中。除非将日志 文件移至另一个位置,否则,联机磁盘空间最终将会填满。 , 当启用userexit配置参数时,用户出口程序会将归档的日志文件移至另一个位置。 要允许下列情况,附加的日志空间仍是必需的。 , 等待用户出口程序移动的联机归档日志。 , 要格式化以供将来使用的新日志文件。 5.9 临时表的空间需求 某些SQL语句需要临时表来进行处理,例如使用一个工作文件来进行不能在内存中执行的排序操作。这些临时表需要磁盘空间,所需的空间量取决于查询以及返回的表的大小,无法估计,如图5-16所示。 图5-16 临时表空间 可以使用数据库系统监控程序和查询表空间API来跟踪在正常操作期间所用的工作空间量。 5.10 数据库分区组 一个数据库分区组定义为属于某个数据库的一个或多个分区的命名集合。作为数据库系统配置的一部分的每个数据库分区,必须在名为db2nodes.cfg的分区配置文件中定义。一个分区组可以只包含一个数据库分区,也可以包含为该数据库系统定义的所有数据库分区。 使用CREATE NODEGROUP语句可创建新的分区组,还可使用ALTER NODEGROUP语句修改它。可以在一个分区组中添加或卸下一个或多个数据库分区。在修改分区组之前,数据库分区必须已在db2nodes.cfg文件中定义。表空间驻留在分区组中,表驻留在表空间内。 可以在一个数据库中定义一个或多个数据库分区的命名子集。定义的每个子集是一个数据库分区组。每个包含多个数据库分区的子集被看作一个多分区数据库分区组。多分区数据库分区组只能使用符合实例的数据库分区定义。 图5-17显示了一个有五个分区的数据库: , 一个数据库分区组跨越几乎一个数据库分区(数据库分区组 1)。 , 一个数据库分区组包含一个数据库分区 (数据库分区组 2)。 , 一个数据库分区组包含两个数据库分区 (数据库分区组 3)。 , 数据库分区组2内的数据库分区可以和数据库分区组1共享。 , 在和数据库分区组1共享的数据库分区组3中存在一个单一的数据库分区。 图5-17 数据库中的数据库分区组 可以使用CREATE DATABASE PARTITION GROUP语句创建一个新的数据库分区组。可以使用ALTER DATABASE PARTITION GROUP语句修改这个分区组。数据分割到数据库分区组中的所有分区中,并且可以从一个数据库分区组中添加或者删除一个或多个数据库分区。如果正在使用一个多分区数据库分区组,就必须看几个数据库分区组设计考虑。 当创建或修改一个分区组时,会有一个分区映像与它相关。分区映像连同分区关键字和散列算法,被数据库管理员用于确定该分区组中哪个数据库分区将存储给定行的数据。 使用非分区数据库时,不需要任何分区关键字或分区映像。若使用非分区数据库,那么就不存在分区组设计考虑事项。数据库分区是数据库的一部分,与用户数据、索引、配置文件和事务日志组成。创建数据库时创建的默认分区组由数据库管理员使用。 , IBMCATGROUP是包含系统目录的表空间的默认分区组。 , IBMTEMPGROUP是系统临时表空间的默认分区组。 , IBMDEFAULTGROUP是包含用户定义表的表空间的默认分区组,可选择将用户创 建的表置于该处。需注意的是,可在IBMDEFAULTGROUP或用户创建的任何分 区组中创建临时表的用户临时表空间,但不能在IBMTEMPGROUP中创建这些表 空间。 DB2支持分区存储模型,这允许用户将数据存储在数据库的多个数据库分区中。这意味着该数据是以物理方式存储在多个数据库分区中,同时仍可以看做数据是位于同一个位置来进行存取。存取一个分区数据库中的数据的应用程序和用户不需要知道该数据的物理位置。 该数据在物理上是分离的,但在逻辑上将它作为一个整体来使用和管理。用户可以选择如何通过说明分区关键字来对数据分区。用户还可以通过选择应存储数据的表空间和相关的分区组,来确定表数据可以分布在哪些数据库分区以及多少个数据库分区上。另外,将可更 新的分区映像与散列算法一起使用,来指定分区关键字值到数据库分区的映射,来确定每行数据的位置和检索。因此,可以将大表的工作负荷分布到整个分区数据库上,并将较小的表存储在一个或多个数据库分区上。每个数据库分区具有它存储的数据的本地索引,这可以提高本地数据库存取的性能。 并不是必须把所有表都分布到数据库中的所有数据库分区上。DB2支持部分撤销群集,这意味着可以将表及其表空间分布到系统即分区组中的数据库分区的一个子集上。 当用户想要将表放在每个数据库分区上时,可考虑的替代方法就是使用实体化查询表,然后复制这些表。可以创建包含所需信息的实体化查询表,然后将它复制到每个分区。 5.11 数据库分区组设计 逻辑数据库设计和要处理的数据量将决定数据库是否需要分区。下面主要描述数据库分区组设计所要考虑的事项。 若使用的是多分区组,就应该考虑下列设计要点。 , 在多分区分区组中,若索引是该分区关键字的超集,那么只能创建唯一的索引。 , 根据该数据库中的数据库分区数,可能有一个或多个单分区节点组,且存在一个或 多个多分区组。 , 必须给每个数据库分区指定唯一的分区号。在一个或多个分区组中可能会发现相同 的数据库分区。 , 要确保快速恢复包含系统类目表的数据库分区,就必须避免将用户表放在同一个数 据库分区上。这可通过将用户表放在不包括IBMCATGROUP分区组中的那些数据 库分区的分区组中来实现。 除非要与一个更大的表并置,否则应该将小表放在单分区组中。并置是将不同表中包含相关数据的行放置在同一个数据库分区中。并置的表允许DB2利用更有效的连接策略,并可以驻留在单个分区组中。若表驻留在多分区组中,并且在分区关键字中具有相同数目的列,对应列的数据类型是分区兼容的,那么将这些表现视为并置的。在并置的表中具有相同分区关键字值的行被放置到同一个数据库分区中。这些表可以位于同一个分区组中单独的表空间中,并且仍被认为是并置的。 应该避免将中等大小的表扩展到太多数据库分区上。例如,100MB的表在16个分区组中可能比在32个分区的分区组中执行得更好。 可以使用分区组将联机事务处理(OLTP)表与决策支持(DSS)表分离,以确保OLTP事务的性能不受负面影响。 5.12 分区映射 在分区数据库环境中,数据库管理员必须设法弄清一个表的哪些行存储在哪些数据库分区上。数据库管理程序必须知道到哪里去查找所需的数据,并使用一个名为分区映射的映射来查找数据。 分区映射是一个内部生成的数组,对于多分区组,它包含4096项,对于单分区组,只包含一项。对于单分区组,分区映射只有一个项,该项包含用于存储一个数据库表所有行的数据库分区的分区号。对于多分区组,以循环方式指定分区组的分区号,正如使用网格将城市地图划分为区一样,数据库管理员使用分区关键字来确定存储数据的位置,即数据库分区。 例如,假定用户将在4个数据库分区(编号为0,3)上创建一个数据库。此数据库的 IBMDEFAULTGROUP分区组的分区映射如下。 0 1 2 3 0 1 2 „ 若已使用数据分区1和2在该数据库中创建了一个分区组,那么该分区组的分区映射如下。 1 2 1 2 1 2 1 „ 若要装入数据库的一个表的分区关键字是一个可能在1,500000范围之间取值的整数,那么会将分区关键字散列到0,4095之间的一个分区号上。将该编号用作分区映射中的索引,来选择用于该行的数据库分区。图5-18显示如何将具有分区关键字值 (c1, c2, c3)的行映射到分区2,然后引用数据库分区n5。 图5-18 分区映射 分区映射用于灵活控制将数据存储在一个分区数据库中的位置。若将来需要更改数据库中各数据库分区上的数据分布,可以使用数据重新分布实用程序。此实用程序允许重新协调或调整数据分布。可以使用获取表分区信息(sqlugtpi)API,来获取用户可以查看的分区映像的副本。 5.13 分区关键字 分区关键字是一列或一组列,用于确定将某行数据存储在什么分区。分区关键字是使用CREATE TABLE语句在表上定义的。若没有为一个表空间中的表定义分区关键字,默认情况下就根据主关键字的第一列创建一个分区关键字。该表空间被划分为一个分区组中的多个数据库分区。若未指定主关键字,那么默认分区关键字就是在该表中定义的第一个非长整数字段列,长整数包括所有长整数数据类型和所有大对象数据类型。若正在与单个分区组相关的表空间中创建一个表,并且用户希望有一个分区关键字,那么就必须明确地定义该分区关键字。一般情况下,不会创建分区关键字。 如果没有列满足默认分区关键字的要求,就会创建不带关键字的该表。仅在单个分区组中才允许不带分区关键字的表。以后可以使用ALTER TABLE语句添加或卸下分区关键字。只能对表空间与单空间组相关的表更改分区关键字。选择好的分区关键字很重要。应考虑下面的事项。 , 如何存取表。 , 查询工作负荷的性质。 , 数据库系统所使用的连接策略。 如果并置不是主要的考虑事项,那么一个好的表分区关键字就是要考虑的主要事项,它可以将数据均匀地分布在分区组中的所有数据库分区上。与一个分区组相关的表空间中每个表的分区关键字确定这些表是否已并置。下列情况下,表被认为是并置的。 , 表被置于同一个分区组中的表空间内。 , 每个表中的分区关键字具有相同数量的列。 , 对应列的数据类型是分区兼容的。 这确保并置的表中具有相同分区关键字值的那些行位于同一个分区上。不适当的分区关键字会导致数据分布不均匀。数据分布不均匀的列和含有少数相异值的列不应选作分区关键字。相异值的数目必须足够大,来确保将行均匀地分布到分区组中的所有数据库分区上。应用分区散列算法的成本与分区关键字的大小是成正比的。分区关键字不能超过16列,而且列越少,性能越好。不应将不需要的列包括在分区关键字中。 当定义分区关键字时,应考虑下列几点。 , 不支持创建只含有长整数数据类型(LONG VARCHAR、LONG VARGRAPHIC、 BLOB、CLOB或DBCLOB)的多分区表。 , 不能改变分区关键字的定义。 , 不能更新表中某一行的分区关键字的列值。 , 只能删除或插入分区关键字的列值。 , 分区关键字应该包括最频繁连接的列。 , 分区关键字应该由经常参与GROUP BY子句的列组成。 , 任何唯一关键字或主关键字必须包含所有分区关键字列。 , 在联机事务处理(OLTP)环境中,分区关键字中的所有列都应该使用带常量或主 变量的等于(,)谓词来参与该事务。例如,假定有一个在事务中经常使用的雇员 号cmp_no,如下所示。 UPDATE emp_table SET … WHERE Emp_no = host-variable 在这种情况下,EMP_NO列对于EMP_TABLE而言是一个不错的单列分区关键字。 散列分区是确定分区表中每一行的位置的方法。该方法的步骤如下。 , 将散列算法应用于分区关键字的值,并生成界于0,4095之间的分区号。 , 在创建分区组时创建分区映射。每个分区号依次按照循环方式重复,来填写该分区 映射。下面的分区映射一节将会详细介绍。 , 该分区号用作分区映射中的一个索引。分区映射中该位置处的编号是存储该行的数 据库分区的编号。 5.14 表并置 用户可能会发现,作为对特定查询的响应,两个或多个表频繁地提供数据。在这种情况下,用户会希望这种表中的相关数据的位置尽可能地相互靠近。在数据库被物理划分为两个或多个数据库分区的环境中,必须有一种方法可将划分的表的有关碎片尽可能地靠近。实现这个过程的功能称为表并置。 当表存储在同一个分区组中,并且它们的分区关键字兼容时,这些表就是已经并置了的。将两个表置于同一个分区组中,确保存在一个公共的分区映像。这些表可能位于不同的表空间,但是这些表空间必须与同一个分区组相关。每个分区关键字中对应列的数据类型必须是分区兼容的。下一节将详细介绍分区兼容性。 当存取用于连接或子查询的多个表时,DB2能够识别要连接的数据是否位于同一个数 据库分区上。当发生这种情况时,DB2可以选择在存储该数据的数据库分区上执行连接或子查询,而不必在数据库分区之间移动数据。这种在数据库分区上执行连接或子查询的能力具有显著的性能优点。 5.15 分区兼容性 对分区关键字的对应列的基本数据类型进行比较,并可将它们说明为分区兼容的。分区兼容的数据类型具有如下特性:具有相同但有不同类型的两个变量会按照相同的分区算法映射到同一个分区号上。 分区兼容性的特点如下。 , 基本数据类型与另一个相同的基本数据类型兼容。 , 内部格式用于DATE、TIME和TIMESTAMP数据类型。它们彼此都不兼容,而且 都不与CHAR兼容。 , 分区兼容性不受带有NOT NULL或FOR BIT DATA定义的列的影响。 , 对兼容数据类型的空值的处理是完全相同的;对不兼容数据类型的空值的处理可能 不相同。 , 用户定义类型的基本数据类型用于分析分区兼容性。 , 对分区关键字中值相同的小数的处理是完全相同的,即使它们的标度和精度不同。 , 字符串(CHAR、VARCHAR GRAPHIC或VARGRAPHIC)中的尾部空格会被散列 算法忽略。 , BIGINT、SMALLINT和INTEGER是兼容的数据类型。 , REAL和FLOAT是兼容的数据类型。 , 不同长度的CHAR和VARCHAR是兼容的数据类型。 , GRAPHIC和VARGRAPHIC是兼容的数据类型。 , 分区兼容性不适用于LONG VARCHAR、LONG VARGRAPHIC、CLOB、DBCLOB 和BLOB数据类型,因为不支持它们作为分区关键字。 5.16 复制实体化查询表 复制实体化查询表是由查询定义的表,也用于确定表中的数据。实体化查询表可用于改进查询的性能。如果DB2确定查询的一部分可以使用实体化查询表来解决,那么数据库管理程序可以重写该查询,来使用实体化查询表。 在分区数据库环境中,可以复制实体化查询表。可以使用复制的实体化查询表来改进查询性能。可能已在单分区组中创建了一个复制的实体化查询表,但用户想要在分区组中的所有数据库分区中进行复制的表。要创建复制的实体化查询表,调用带REPLICATED关键字的CREATE TABLE语句。只能对使用REFRESH DEFERRED选项定义的实体化查询表指定REPLICATED关键字。 通过使用复制的实体化查询表,可将通常未并置的表并置。对于一个大的事实表和一个小的维表的连接,复制的实体化查询表特别有用。要将所需的额外存储器以及必须更新每个副本所引起的影响降到最小,要复制的表应该比较小,并且不经常更新。 还应考虑复制那些不经常更新的更大的表,复制的一次性成本可以通过并置获得的性能效益来抵消。 通过在定义复制表所用的子查询子句中指定适当的谓词,可以复制选择的列和/或选择 的行。 5.17 表空间设计 表空间是一种存储模型,它提供一种数据库和存储在该数据库中的表之间的一个间接层。表空间驻留在分区组中,它们允许将数据库和表数据的位置直接指定到容器上。容器可以是目录名、设备名或文件名。这可以促进性能的改善、更灵活的配置以及更好的完整性。 因为表空间驻留在分区组中,所以选择保存表的表空间时要定义如何将该表的数据分布到分区组中的数据库分区上。单个表空间可以跨越多个容器。在同一个物理磁盘即驱动器上创建多个容器是可能的,容器就是一个或者多个表空间。为了提高性能,每个容器应使用不同的磁盘。图5-19举例说明了一个数据库内的表和表空间与该数据库相关的容器之间的关系。 图5-19 数据库中的表空间和表 EMPLOYEE和DEPARTMENT表在HUMANRES表空间中,该表空间跨越容器0、1、2和3。PROJECT表在容器4的SCHED表空间里。这个示例显示一个独立磁盘上已有的每个容器。 数据库管理程序会尝试平衡分布在所有容器中的数据负荷,因此,所有容器都将用于存储数据。数据库管理程序在使用另一个容器之前写入一个容器的页数称为数据块大小。数据库管理程序并非始终从第一个容器开始存储表数据。 图5-20显示具有两个4KB页数据块大小的HUMANRES表空间,它有4个容器,每个容器有少量已分配的数据块。DEPARTMENT和EMPLOYEE表都有7页,并且横跨全部的4个容器。 图5-20 容器和数据块 一个数据库必须至少包含以下三种表空间,如图5-21所示。 图5-21 表必须具备的三种表空间 1. 一个系统类目表空间 系统类目表空间包含该数据库的所有系统类目表。此表空间称为SYSCATSPACE,如图5-21,它不能被卸下。IBMCATGROUP是这个表空间的默认分区组。 2. 一个或多个用户表空间 用户表空间包含所有的用户自定义的表。默认情况下,会创建一个表空间USERSPACE1,如图5-21。IBMDEFAULTGROUP是这个表空间的默认分区组。 当创建一个表时,应指定表空间名,否则可能达不到用户所期望的结果。如果不指定表空间名,就应根据下列 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 放置该表:如果存在用户创建的表空间,那么就选择页大小最小,但对这个表而言需要足够大的表空间;否则,如果USERSPACE1的页大小对此表而言足够 大,就使用它。如果不存在具有足够大页大小的表空间,就不创建这个表。表的页大小或者由行大小决定,或者由列数确定。一行中允许的最大长度取决于创建这个表所在的表空间的页大小。可能的页大小的值为4KB(这是默认值)、8KB、16KB和32KB。可以使用具有一种页大小的表空间作为基表,而使用具有另一种页大小的另一个表空间来存储长整数或大对象数据。记住SMS不支持跨表空间的表,而DMS却支持。如果列数或行大小超过表空间大小的限制,就返回一个错误SQLSTATE 42997。 3. 一个或多个临时表空间 临时表空间包含临时表。临时表空间可以是系统临时表空间或用户临时表空间。数据库必须至少有一个系统临时表空间,在默认情况下,创建数据库时会创建一个名为TEMPSPACE1的系统临时表空间,如图5-21所示。IBMTEMPGROUP是这个表空间的默认分区组。用户临时表空间不是在创建数据库时默认建立的。 如果一个数据库使用多个临时表空间,则以循环方式将临时对象分配给这些临时表空间,如图5-22所示。如果对用4KB以上的页大小定义的表空间中的表进行查询,那么某些查询就可能会失败,例如对1012列使用ORDER BY。若没有使用更大页大小定义的临时表空间,就会发生这种情况。可能需要创建具有更大页大小(8KB、16KB或32KB)的临时表空间。如果没有与用户表空间中的最大页大小具有相同页大小的临时表空间,任何一种数据操作语言(DML)语句都可能失败。 图5-22 管理临时表空间 应定义一个系统管理空间(SMS)临时表空间,使其页大小等于大多数用户表空间所使用的页大小,这样就足以对付典型的工作环境和工作负荷了。 在分区数据库环境中,系统类目分区将包含全部3个默认的表空间,而其它每个数据库分区将只包含TEMPSPACE1和USERSPACE1。 有两种类型的表空间,它们都可以在单个数据库中使用。 , 系统管理空间:操作系统的文件管理器控制该存储空间。 , 数据库管理空间的表空间:数据库管理程序控制该存储空间。 5.18 系统管理空间 在系统管理空间(SMS)的表空间中,操作系统的文件系统管理器分配和管理用于存储表的空间。该存储模型通常由存储在文件系统空间中的多个文件组成,这些文件表示表对象。用户决定这些文件的位置,DB2控制它们的名称,而文件系统负责管理它们。通过控制写入每个文件的数据量,数据库管理程序均匀地将数据分布在所有表空间容器中。SMS表空间是默认表空间。 每个表至少有一个与它相关的SMS物理文件。后面会进一步详细介绍SMS物理文件。在SMS表空间中,当对象增大时,文件每次扩展一页。若需要提高插入性能,可以考虑启用多页文件分配,这允许系统一次为文件分配或扩展多页。必须运行db2empfa,才可以启用多页文件分配。在分区数据库环境中,必须对每个数据库分区运行db2empfa。一旦启用了多页文件分配,就不能禁用它。 应该在CREATE DATABASE命令上或CREATE TABLESPACE语句上使用MANAGED BY SYSTEM选项来显式地定义SMS表空间。当设计SMS表空间时,必须考虑两个关键因素。 , 表空间的容器。 必须指定要用于表空间的容器的数目。标识要使用的所有容器是非常重要的,因为 用户不能在创建了SMS表空间之后添加或删除容器。在分区数据库环境中,当将一个 新的分区添加至SMS表空间的分区组时,可以使用ALTER TABLESPACE语句为新的 分区添加容器。用于一个SMS表空间的每个容器都标识一个绝对或相对的目录名,其 中每个目录都可以位于不同的文件系统或物理磁盘上。表空间的最大大小可以按以下方 法估计。 容器数×(操作系统支持的最大文件系统大小) 此公式假定有一个唯一的文件系统映射至每个容器,并且每个文件系统都具有最大 量的可用空间。实际上,情况可能不是这样,表空间最大大小可能小得多。 定义容器时必须小心,如果容器上已有文件或目录,将返回一个错误SQL0298N。 , 表空间的数据块大小。 只能在创建表空间时指定数据块大小,因为以后就不能更改它。所以,选择一个合 适的数据块大小的值就很重要。当创建表空间时,如果不指定数据块大小,那么数据库 管理程序将使用默认数据块大小来创建表空间,该默认大小由dft_extent_sz数据库配置 参数定义。此配置参数最初是根据创建该数据库时提供的信息设置的。如果在CREATE DATABASE命令中没有指定DFT_EXTENT_SZ参数,那么就会将默认数据块大小设置 。要为表空间的容器数和数据块大小选择适当的值,必须了解以下内容。 为32 , 操作系统对逻辑文件系统的大小施加的限制。 , 例如,某些操作系统有2GB的限制。因此,如果想要一个64GB的表对象, 那么就在这种类型的系统上将需要至少32个容器。 , 当创建该表空间时,可以指定驻留在不同文件系统上的容器,以便增加可以存 储在该数据库中的数据量。 , 数据库管理程序如何管理与一个表空间相关的数据文件和容器。 , 在为该表空间指定的第一个容器中创建第一个表数据文件SQL0001.DAT,并 允许这个文件增大到该数据块的大小。当它达到这个大小之后,数据库管理程 序将数据写入到下一个容器中的SQL00001.DAT文件中。这个过程会一直继 续,直到所有容器都包含SQL00001.DAT文件为止,在那时,数据库管理程 序会返回到第一个容器。这个过程称为条形化分布,会继续在容器目录中运行, 直到一个容器装满为止SQL0289N或操作系统中已无空间可分配为止,这是 磁盘已满错误。条件化分布也用于索引SQLnnnnn.INX、长整数字段 SQLnnnnn.LF和LOB文件(SQLnnnnn.LB和SQLnnnnn.LBA)。 只要任何一个容器已满,SMS表空间就满了。因此,为每个容器分配相同容器的空间 是很重要的。 为了有助于让数据更加均匀地分布到这些容器中,数据库管理程序就根据表标识符(在 上例中其值为1)除以容器数所得的模,来确定首先要使用哪个容器。容器是从0开始依次 编号的。 下列SMS物理文件可以在SMS表空间目录容器中找到。 , SQLTAG.NAM:每个容器的子目录中都存在这样一个文件,而且当连接数据库以 验证该数据库是否完整和一致时,数据库管理程序就要使用它们。 , SQLnnnnn.DAT:表文件。它存储所有表行,但LONG CARCHAR、LONG VARGRAPHIC、BLOB、CLOB或DBCLOB数据除外。 , SQLnnnnn.LF:包含LONG VARCHAR或LONG VARGRAPHIC数据文件,也称为 长整数字段数据。仅当表中存在LONG VARCHAR或LONG VARGRAPHIC列时, 才创建这个文件。 , SQLnnnnn.LB:包含BLOB、CLOB或DBCLOB数据也称为LOB数据的文件。仅 当表中存在BLOB、CLOB或DBCLOB列时,才创建这些文件。 , SQLnnnnn.LBA:包含有关SQLnnnnn.LB文件的分配和空闲空间信息的文件。 , SQLnnnnn.INX:表的索引文件。对应表的所有索引都存储在这个单一文件中。仅 当定义了索引时,才创建该文件。 当卸下一个索引时,索引(.INX)文件实际上并没有释放该空间,除非删除该索引文件。如果表上的所有索引都被卸下,或该表被重组,那么就会删除该索引文件。如果还没有删除该索引文件,那么一旦实现了卸下操作,就会把该空间标记为空闲的,并将重新使用它,以便将来创建索引或维护索引。 , SQLnnnnn.DTR:用于重组DAT文件的临时数据文件。当重组一个表时,REORG 实用程序通过调用REORG TABLE命令,会在其中一个系统临时表空间中创建爱 你一个表。可以定义这些临时表空间使用与用户定义表所用的不同的容器。 , SQLnnnnn.LFR:用于重组LF文件的临时数据文件。当重组一个表时,REORG实 用程序通过调用REORG TABLE命令,会在其中一个系统临时表空间中创建一个 表。可以定义这些临时表空间使用与用户定义表所用的不同的容器。 , SQLnnnnn.RLB:用于重组LB文件的临时数据文件。当重组一个表时,REORG实 用程序通过调用REORG TABLE命令,会在其中一个系统临时表空间中创建爱你 一个表。可以定义这些临时表空间使用与用户定义表所用的不同的容器。 , SQLnnnnn.RBA:用于重组LBA文件的临时数据文件。当重组一个表时,REORG 实用程序通过调用REORG TABLE命令,会在其中一个系统临时表空间中创建一 个表。可以定义这些临时表空间使用与用户定义表所用的不同的容器。 不要直接更改这些文件,只能使用记载的API和实现那些API的工具包括命令行处理 器和控制中心来间接存取它们。 不要移动这些文件。 不要删除这些文件。 唯一支持数据库或表空间备份的方法就是通过sqlubkp(备份数据库)API,包括利用该 API的命令行处理器和控制中心来实现。 5.19 数据库管理空间 在数据库管理空间(DMS)的表空间中,数据库管理程序控制存储空间。该存储模型 由有限数量的设备组成,由DB2管理这些设备的空间。管理员决定要使用哪个设备,而DB2 管理那些设备上的空间。这个表空间实质上是为了最好地满足数据库管理程序的需要而设计 的特殊目的的文件系统。该表空间定义包括一些设备或文件的列表,它们属于可以用来存储 数据的表空间。 包含用户定义的表和数据的DMS表空间可以定义如下。 , 存储正常表和索引数据的规划表空间。 , 存储长整数字段或LOB数据的长整数表空间。 在设计DMS表空间和容器时,应该考虑下列事项。 , 数据库管理程序使用“拆开”来确保数据均匀地分布在所有容器上。 , 对于4KB页,规则表空间的最大大小为64KB;对于8KB页,是128GB;对于16KB 页,是256GB;对于32KB页,是512GB。长整数表空间的最大大小为2TB。 , 与SMS表空间不同,组成一个DMS表空间的容器不必大小相同。然而,通常不 建议这样做,因为会导致在容器间不均匀地进行条形化分布,并会降低性能。只要 有一个容器已满,DMS表空间就会使用其它容器中的可用空闲空间。 , 因为空间是预分配的,所以在能够创建表空间之前,该空间必须是可用的。当使用 设备容器时,该设备也必须具有足够的空间以便于存储容器的定义。每个设备上只 能定义一个容器。为了避免浪费空间,设备的大小应该等于容器的大小。例如,如 果给该设备分配5000页空间,而将设备容器定义为分配3000页,那么设备上的 2000页将是不可用的。 , 每个容器上有一页是为额外开销保留的,其余的页将一次使用一个数据块。只使用 整个数据块,因此为了对空间进行最优管理,可以使用如下公式来帮助用户确定分 配容器时要使用的适当大小。 (extent_size×n),1 其中,extent_size是表空间中每个数据块的大小,n是用户要在该容器中存储的数 据块数。 , 表空间中有3个数据块是保留给额外开销使用的。 , 要存储任何用户表数据,至少需要两个数据块。这些数据块是一个表的规则数据所 必需的,但不是任何索引、长整数字段或大对象数据所需的,它们需要自己的数据 块。 , 设备容器必须使用带字符型特殊接口的逻辑卷,而不是物理卷。 , 在DMS表空间中可以使用文件代替设备。文件和设备之间不存在操作上的区别, 但是,由于存在与文件系统相关的运行期间 额外开销,文件可能效率较低。在下 列情况下,适合使用文件。 , 设备不直接支持。 , 设备不可用。 , 不需要最大性能。 , 不需设置设备。 , 如果工作负荷涉及LOB或LONG VARCHAR数据,就可以通过文件系统高速缓存 改进性能。DB2的缓冲池不缓冲LOB和LONG VARCHAR数据。 , 某些操作系统允许拥有大小超过2GB的物理设备。应该考虑将该物理设备分区为 多个逻辑设备,以使任何容器都不超过操作系统允许的大小。 5.20 表空间映射 一个表空间映射就是一个描述表空间中页位置的逻辑到物理的转换的DMS表空间在DB2中的内部表示。下面描述为什么表空间映射有用以及一个表空间映射中的信息从哪里来。在一个DB2数据库中,DMS表空间中的页逻辑上从0到(N-1)编码,其中N表示表空间中有用的页的数目。DMS表空间中的页按照一定度编组,并且从一个表空间管理的角度来看,在度的基础上完成所有对象的分配。这就是说一个表可能仅仅使用度中页的一半,但是整个度都被考虑为那个对象使用和占有。默认情况下,一个度用来占据容器标签,而这个度中的页不能用于占据数据。然而,如果启用了DB2_USE_PAGE_CONTAINER_TAG注册变量,那么只有一页用于这个容器标签。 由于容器中的空间由度来分配,不构成整个度的页将不会被使用。例如,如果有一个度大小为10的205页的容器,将使用一个度作为标签,而19个度将可用于数据,可是五个剩余的页就浪费了。如果一个DMS表空间包含单个容器,那么从逻辑页号码到磁盘上的物理位置的转换将十分直接,这里页0、1、2将按照相同的次序在磁盘上定位。如果有多个容器并且每个容器具有相同的大小,那么这也是相当直接的过程。包含0到(度大小,1)个页的表空间的第一个度将位于第一个容器中,第二个度将位于第二个容器中,依此类推。在最后的容器后面,这个过程返回到开端,从第一个容器重新循环。 对于包含不同大小的容器的表空间,单次轮回的方法不能使用,因为这种方法不能利用较大容器的额外空间。这就是产生表空间映射的原因,这就显示度是如何在表空间中定位的,来确保物理容器中的所有度都可以使用。 在下面的例子中,容器大小不考虑容器标签的大小。容器的大小非常小,并且这个大小只用于举例的目的,它们不推荐作为容器的大小。这个例子显示表空间中不同大小的容器,但不建议使用相同大小的容器。 例1. 在一个表空间中有3个容器,每个容器包含80个可用的页,并且这个表空间的度为20。因而每个容器的度为4(80/20,4),总共有12个度。这些度在磁盘上定位,如图5-23所示。 图5-23 具有3个容器和12个度的表空间 要查看一个表空间映射,就使用快照监视器给一个表空间拍快照。在例1中有三个相同 大小的容器,那么这个表空间映射如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 11 239 0 3 0 3 (0, 1, 2) 一个行列就是相邻的类别行列全部包含相同的容器集合的映射片。在例1中,所有的类别 (0 到 3) 包含3个容器的相同集合 (0、1和2) ,因而这就考虑单一的行列。 这个表空间映射的头部2为行列号码、设置类别、不设置类别、行列给出的最大度、行列给出的最大页、启动类别、结束类别、行列调整和容器列表。在例2中将有详细的解释。这个表空间也可以表示为图5-24,其中每个垂直线对应于一个容器,每个水平线称为类别,并且每个单元号码对应于度。 图5-24 具有3个容器和12个度的表空间(强调类别) 例2. 在表空间中有两个容器:第一个有100页大小,第二个有50页大小,并且度大小为25。这就意味着第一个容器有四个度,而第二个容器有两个度。这个表空间可以表示为图5-25。 图5-25 具有两个容器并强调行列的表空间 类别 0 和 1 包含两个容器 (0 和 1) ,但类别 2 和 3 只包含第一个容器 (0)。这些类别集合中的每一个都是一个行列。这个表空间映射就如在表空间快照里的一样,如下所示。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 3 99 0 1 0 2 (0,1) [1] [0] 0 5 149 2 3 0 1 (0) 在第一个行列中有四个度,因而在这个行列(最大度)中给出的最大度数目为3。每个度有25个页,因而在第一个行列中有100页。由于页也从0开始编号,所以行列中给出的最大页数目(最大页)为99。在这个行列中的第一个类别(启动类别)为0,并且在这个行列中最后的类别(结束类别)为1。在这个行列中有两个容器,而且那些容器为0和1。在设置类别方面不设置类别是第一个类别,在这种情况下其值为0,因为只有一个类别设置。当在表空间中重新平衡数据时没有使用行列调整(Adj.)。当从表空间添加空间或者删除空间时可能发生重新平衡。重新平衡没有发生时,这就总是为0。 在第二个行列中有两个度,并且因为前面页中给出的最大度数目为3,这个行列中给出的最大度数目为5。在第二个行列中有50页(2度×25页),并且由于先前页中给出的最大页数目为99,这个行列中给出的最大页数目为149。这个行列从类别2开始,到类别3结束。 5.21 如何在DMS表中添加和扩展容器 当创建一个表空间时,就创建了其表空间映射,并且所有的初始容器都排好队,这样它们从类别0开始。这就是说数据平稳地从表空间容器中访问过,直到填满了个别容器。 ALTER TABLESPACE语句用来向一个现存表空间添加容器,来增加它的存储容量。然后,该表空间的内容要在所有容器中重新平衡,在重新平衡期间,不限制对该表空间的存取。如果需要添加多个容器,就应该在ALTER TABLESPACE语句中或在同一个事务中同时添加它们,以免数据库管理程序不得不多次重新平衡这些容器。 可以为已经存在的表空间添加新的容器。当时用ALTER TABLESPACE语句加入一个新的容器时,数据库管理器会在所有的容器之间重新分配表空间中的数据,包括新加入的数据。当要添加多个容器时,最好一次性添加全部的容器,来避免由于多次重新分配数据而造成的 额外开销的浪费。为了获取最好的并行处理能力,最好要把每个容器放到不同的磁盘上,这样就可以大大提高数据访问的并行能力。 ALTER TABLESPACE MYTABSP ADD (FILE ‘e:\mydb2\mytabsp\newspace.dat’ 40000) 应使用LIST TABLESPACE CONTAINERS或LIST TABLESPACES命令来检查一个表空间的容器的满载程度。应在现存容器几乎满载或完全满载之前添加新容器。在完成重新平衡之后,才可以利用所有容器上的新空间。 添加比现存容器小的容器会导致数据分布不均匀。这可能导致并行I/O操作,如预读取数据,它们的执行效率比在大小相同的容器上执行的效率低。 1. 重新平衡 当添加或扩展容器时重新平衡过程包括从一个位置移动表空间度到另一个位置,并且这样做是为了保持表空间中的数据类别。 重新平衡时对表空间的访问不受限制,对象可以删除、创建以及查询,就和平时一样。但是,重新平衡操作可能对性能有所冲击。如果需要添加多个容器,并且计划重新平衡这些容器,就应该在单个ALTER TABLESPACE语句中同时添加这些容器,来阻止数据库管理员多次重新平衡这些数据。 表空间高水准在重新平衡过程中起关键作用。高水准是表空间中最高分配页的页数。例如,一个表空间有1000页和10个度大小,最后100个度。如果第42个度是表空间中的最高分配度,这就意味着最高水准为42×10 = 420 页。这和已经使用的页不同,因为最高水准下的一些度可能已经释放,并且可以再次使用。 在重新平衡之前,将基于容器改变建立一个新的表空间映射。重新平衡器从当前映射到新映射的位置移除度。这个重新平衡从度0启动,删除一个度直到占有高水准的度已经删除。当删除每个度时,当前的映射就会改变一点就像新的映射。重新平衡完成之后,当前映射和新映射应该按照高水准的类别是同一的。 添加一个新容器时,新映射中容器的替换依赖于容器的大小和类别集合中其它容器的大小。如果这个容器足够大以致于可以从类别集合的第一个类别开始,而到最后一个类别结束,那么就那样放置。如果这个容器不是很大,那就要在映射中定位这样可以以最后的类别结束。这么做是为了尽可能减少需要重新平衡的数据。 在下面的例子中,容器不考虑容器标签的大小。容器大小非常小,只是作为演示罢了,不推荐作为容器的大小。这个例子显示表空间中不同大小的容器,但是建议使用相同大小的容器。 例3. 如果创建一个具有三个容器和度10的表空间,并且三个容器分别有60、40和80页(6、4和8度),那么这个表空间可以使用映射创建,如图5-26所示。 图5-26 重新平衡举例 相应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 11 119 0 3 0 3 (0,1, 2) [1] [0] 0 15 159 4 5 0 2 (0, 2) [2] [0] 0 17 179 6 7 0 1 (2) 这个表空间映射的头部2为行列号码、设置类别、不设置类别、行列给出的最大度、行列给出的最大页、启动类别、结束类别、行列调整和容器列表。 例4. 如果添加一个80页的容器到一个表空间中,那么这个容器应该足够大以从第一个类别(类别 0)启动,并结束于最后的类别(类别 7)。其结果表空间如图5-27所示。 图5-27 结果表空间 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 15 159 0 3 0 4 (0,1, 2, 3) [1] [0] 0 21 219 4 5 0 3 (0, 2, 3) [2] [0] 0 25 259 6 7 0 2 (2, 3) 如果高水准为度14以内,重新平衡就要从度0开始,然后移动所有的度直到度14。映射中度0的位置是相同的,这样这个度就不需要移动。度1和度2也是如此,度3就需要移动,因此从旧位置读取这个度,然后写到新位置上。此度之后的所有度直到度14 都要移动。一旦度14已经移动了,当前映射就看做新映射,而重新平衡就终止了。 如果映射被改变以在高水准之后新加空间,那么就不需要重新平衡,并且所有空间都可以马上使用。 例5. 考虑例3中的表空间,如果扩展容器从40页到80页,那么新表空间就如图5-28所示。 图5-28 新表空间 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 17 179 0 5 0 3 (0,1, 2) [1] [0] 0 21 219 6 7 0 2 (1, 2) 例6. 考虑例1中的表空间。如果向这个表空间添加一个50页(5个度)的容器,那么这个容器就按照下面的方式添加到新映射中。这个容器不是足够大来从第一个类别(类别0)启动并在最后的类别(类别7)结束,因此需要定位于最后的类别,如图5-29所示。 图5-29 新映射后的表空间 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 8 89 0 2 0 3 (0,1, 2) [1] [0] 0 12 129 3 3 0 4 (0, 1, 2, 3) [2] [0] 0 18 189 4 5 0 3 (0, 2, 3) [3] [0] 0 22 229 6 7 0 2 (2, 3) 要扩展一个容器,就要使用ALTER TABLESPACE语句的EXTEND或RESIZE选项。要添加容器并重新平衡数据,就要使用ALTER TABLESPACE语句中的ADD选项。如果添加一个容器到已有多个类别集合的表空间中,就可以指定要添加的类别集合。这就要使用ALTER TABLESPACE语句的ADD TO STRIPE SET选项。如果不指定一个类别集合,默认的行为就要添加到这个容器的当前类别集合中。当前类别集合就是最近创建的类别集合,而不是已经添加空间的类别集合。 对类别集合的任何改变都可能引起类别集合重新平衡的发生以及后续事件。可以使用表空间快照监视重新平衡的过程。一个表空间快照可以提供有关一个重新平衡的信息,例如重新平衡的起始时间、已经移动了多少度以及还要移动多少度。 2. 无重新平衡 (使用类别集合) 如果要添加或扩展一个容器,并且添加到表空间的高水准,一个重新平衡就不会发生。添加一个容器几乎总是把空间添加到低水准。换句话说,添加容器时重新平衡是很经常的。这里有一个选项,来强制添加新容器到高水准,这样就不必选择重新平衡表空间的内容。这种方法的好处在于可以马上使用新容器。仅当添加容器而不是扩展现有的容器时才应用不重新平衡的选项。当扩展容器时,只有添加的空间位于高水准才能避免重新平衡。例如,如果 有许多相同大小的容器并要以相同的数量扩展每个容器,那么度的相对位置就不会改变,而且一个重新平衡就不会发生。 要无须重新平衡就能添加容器,就要使用ALTER TABLESPACE语句中的BEGIN NEW STRIPE SET选项。 例7. 如果有一个带三个容器和度大小为10的表空间,并且这些容器分别有30、40和40页(相应地分别3、4和4度),那么这个表空间如图5-30所示。 图5-30 例7的表空间 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 8 89 0 2 0 3 (0,1, 2) [1] [0] 0 10 109 3 3 0 2 (1, 2) 例8. 当使用BEGIN NEW STRIPE SET选项添加两个30页和40页(分别3度和4度)的容器时,现有的行列不会受影响,并且将会创建新的行列。新的行列集合是一个类别集合,而且最近创建的行列集合就称为当前类别集合。添加这两个新容器之后,这个表空间就如图5-31所示。 图5-31 添加两个容器的表空间 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 8 89 0 2 0 3 (0,1, 2) [1] [0] 0 10 109 3 3 0 2 (1, 2) [2] [1] 4 16 169 4 6 0 2 (3, 4) [3] [1] 4 17 179 7 7 0 1 (4) 如果要添加新容器到一个表空间中,并且不使用TO STRIPE SET选项和ADD子句,那么这些容器就添加到当前类别集合(最高类别集合)。可以使用ADD TO STRIPE SET子句,来添加容器到表空间中的任何类别集合中。必须指定一个有效的类别集合。 DB2使用表空间映射并无需重新平衡添加新容器来跟踪类别集合,将通常引起这个映射比容器重新平衡时更快。当表空间映射变得太大时,就在试图添加更多容器时接收错误SQL0259N。 5.22 如何在DMS表中删除和减少容器 使用一个DMS表空间,就可以从表空间中删除一个容器或者减小一个容器的大小。使用ALTER TABLESPACE语句来完成这一操作。如果这个操作删除的度的数目小于或者等于这个表空间的高水准上的自由度的数目,才允许删除或减小一个容器。这是必要的,因为页数不能由这个操作改变,因而所有包括高水准的度必须位于这个表空间的相同逻辑位置。因此,结果表空间必须有足够的空间,来占据包含高水准的数据。在没有足够自由空间的情况下,将通过执行这条语句来立即接收一条错误。 高水准是表空间中最高分配页的页数。例如,一个表空间有1000页,度为10,总共100个度。如果第42个度是这个表空间中最高分配的度,这就意味着高水准为42 × 10 = 420 页。这和已使用的页不同,因为高水准下的一些页可能已经释放,这样它们可以再次使用。 当删除或减小容器时,如果数据占据从表空间中删除的空间,一个重新平衡就会发生。 在启动重新平衡之前,要基于容器的改变建立一个新的表空间映射。重新平衡器将从当前映射到新映射位置移动度。重新平衡器从包含高水准的度开始,一次移动一度,直到移走度0。当移动每个度时,当前映射就一次改变一片,来显示新映射。如果当前映射中度的位置和新映射中的位置相同,那么就不移动这个度,并且不会发生I/O。因为重新平衡从高水准开始移动度,以表空间中的第一个度为结束,它就称为反重新平衡。 删除容器时,剩余容器再次计数这样它们的容器Ids从0开始,依次增1。如果类别中的所有容器都删除了,类别集合就会从这个映射移动,并且这个映射中所有跟随的类别集合将被轮流移动和再次编号,这样在类别集合号码之间就没有间隙。 在下面的例子中,容器不考虑容器标签的大小。容器大小非常小,只是作为演示罢了,不推荐作为容器的大小。这个例子显示表空间中不同大小的容器,但是建议使用相同大小的容器。 例如,考虑一个具有三个容器和度大小为10的表空间。其容器分别有20、50和50页(2、5和5度)。这个表空间如图5-32所示。 图5-32 具有三个容器的表空间例子 一个“X”表示这里有一个度,但是在度里面没有数据。 如果要删除含两个度的容器0,在高水准中就必须至少有两个空闲的度。高水准在度7中,留下四个空闲度,所以可以删除容器0。 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 5 59 0 1 0 3 (0,1, 2) [1] [0] 0 11 119 2 4 0 2 (1, 2) 删除之后,这个表空间就已经调整了容器0和容器1。新的表空间如图5-33所示。 对应的表空间映射和表空间快照一样,如下。 行列 设置 不设置 最大度 最大页 启动 结束 Adj. 容器 号码 类别 类别 类别 类别 [0] [0] 0 9 99 0 4 0 2 (0,1) 如果要减小一个容器的大小,这个重新平衡器就以相似的方式工作。 图5-33 删除容器之后的表空间 如果要减小一个容器的大小,就按照相似的方法进行重新平衡。要减小一个容器,就使用ALTER TABLESPACE语句的REDUCE或RESIZE选项。要删除一个容器,就使用ALTER TABLESPACE语句的DROP选项。 5.23 SMS和DMS表空间的兼容性 当决定要使用哪种类型的表空间存储数据时,有许多要考虑的因素。 一个SMS表空间的优点: , 系统按照需求分配空间。 , 创建一个表空间需要更少的初始工作,因为不必预先定义这些容器。 一个DMS表空间的优点: , 可以使用ALTER TABLESPACE语句,通过添加或扩展容器来增加一个表空间的大 小,如图5-34所示。现存数据可以在新容器集合中自动重新平衡,来获取最优I/O 效率。 图5-34 在表空间中添加容器 , 基于要存储的数据的类型,一个表可以通过多个表空间分割: , 长整数字段和大对象数据 , 索引 , 常规表数据 由于性能原因或者为了提高一个表中的数据存储量,可能要分离表数据。例如,可 以有64 GB常规表数据、64 GB索引数据和2TB长整数数据的空间。如果正在使用8 KB 页,表数据和索引数据可以大到128 GB。如果正在使用16 KB页,可以大到256 GB。 如果正在使用32 KB页,表数据和索引数据可以大到512GB。 , 如果操作系统允许的话,可以控制磁盘上的数据位置。 , 如果所有表数据都在单一的表空间内,那么可以删除和再次定义这个表空间。 , 一般来说,一个很好调节的DMS表空间的性能将超出SMS表空间。 在Solaris平台上,带原始设备的DMS表空间特别适合于关键性能的工作负载。一般来说,小型个人数据库使用SMS表空间更易于管理。另一方面,对于大型增长型数据库,每张表可能只能使用SMS表空间作为临时表空间和系统类目表空间以及分开的多容器的DMS表空间。而且,可能要在自己的表空间上存储长整数字段数据和索引。 如果选择使用带设备容器的DMS表空间,就必须主动调节和管理环境。 5.24 表空间磁盘I/O 表空间的类型和设计决定了表空间的I/O性能。下面给出在考虑有关表空间设计和使用的更深专题之前应该理解的一些建议。 第一, 考虑以下几种减少CPU开销的因素。 , SQL语句的数目 这与设计直接相关,但与应用程序本身无关。当设计成可以浏览数据或者可以使用 多种方式来访问数据时,就不得不使用一些不必要的SQL:语句,这就将增加应用程序 运行的资源开销。正确的设计应该是把处理的复杂性封装在SQL语句中。系统的开销 与数据如何存储及SQL如何取回必要的数据直接相关。 , 数据行/列数 更新是应用程序的需求,但取回数据行数是由设计所决定的。取回一些不必要的数 据会浪费很多系统的开销。 , 排序 排序是一个物理设计的问题,如果索引设计得好,那么就可以不用排序。排序同样 也是一个应用程序设计问题,即如何使用合适的SQL语句使得系统开销最小。 第二, 为了达到最小的I/O开销,可以适当调整以下组件或者特性。 , 大缓冲池 , 多缓冲池 , 异步写 , 顺序预读 , 多索引使用 , 链表预取 , 无顺序预取 , 无链表预取 第三, 所有的设计都要求锁冲突最小,来最大限度地提高并行操作性能。设计过程中, 为了确保数据的并行操作与使用效率,要注意以下几点: , 最小锁冲突的数据库设计。 , 避免死锁的数据库设计。 , 设计并发操作的应用程序。 所有的DB2平台支持行锁和表锁,在OS/390中有行锁、页面锁、表锁和表空间锁。在UDB中,一般使用行锁。 在OS/390中,行锁只用在多个用户同时访问同一个页面中的不同数据行的情况。此外,使用行锁时要考虑使用它引起的CPU额外开销的增量是否可以容忍。每个页面中行数越多,每个页面中用户数越大,那么用于加锁的开销也就越大。如果用户是对相同的数据行感兴趣,那么使用行锁就不会有助于并行性的提高,相反地,只会增加CPU的处理时间。在这种情况下,oS/390会使用页面锁。 例如,quiesce是一种持续状态的锁,通常为诸如LOAD之类的DB2工具所使用,它属于一个连接,当该连接所属的进程意外中止时,有时quiesce状态依然存在,其他客户端无法查询该表空间里的数据库的表。可以按照下面的步骤,将表空间的状态置为正常状态。 1. 连接到数据库 用 list tablespaces 判断哪个tablespace处于quiesce状态和和取得对象(object)ID,表空间ID。 2. 判断对象ID对应的表 a)用 db2 "select tabname from syscat.tables where tableid=对象ID and tbspaceid=表空间ID" 得到表名,或 b)用 db2 list history 判断是那个表 3. 用 db2 quiesce tablespaces for table 表名 reset 去除quiesce状态 DB2实行大块读取。当再次获取有序或者部分有序的数据时就会发生大块读取。一次读取操作所读的数据量依赖于度的大小,也就是说度越大,一次读取的页就越多。 可以通过改变CREATE TABLESPACE或ALTER TABLESPACE语句中的PREFETCH SIZE选项,来控制预读取的数据量,如图5-35所示。数据库中所有表空间的默认值由dft_prefetch_sz数据库配置参数设置。无论预读何时触发,PREFETCH SIZE参数都告诉DB2有多少页面要读。通过设置PREFETCH SIZE为CREATE TABLESPACE语句中EXTENT SIZE参数的多值,可能引起多个度并行读取。EXTENT SIZE参数指定4KB大小的页面的 数目将在跳到下一个容器之前写到容器中,例如,假定有一个使用三个设备的表空间。如果设置PREFETCH SIZE为EXTENT SIZE的三倍,那么DB2就可以从每个并行的设备读取大块,因而大幅度提高了I/O吞吐量。假设每个设备是一个独立的物理设备,而这个控制器有足够的带宽,来处理每个设备的数据流。DB2可能必须在运行时基于查询速度、缓冲池工具和其它因素调整预取参数。 图5-35 表空间的PREFETCH SIZE参数和EXTENT SIZE参数 一些文件系统使用它们自己的预读方法,例如AIX上的日志文件系统(Journaled File System)。在某些情况下,文件系统预读比DB2预读更有侵入性。这可能引起文件容器的SMS和DMS表空间的预读胜过带设备的DMS表空间的预读。这就误导了,因为可能预读的附加级别的结果发生在文件系统中。DMS表空间应该能够超过任何等价的配置。 5.25 在表空间设计时的负载考虑 DB2可以管理的工作负载的主要类型会影响选择使用什么类型的表空间,以及指定页面的大小。一个在线事务处理 (OLTP) 工作负载以随机访问数据为特征,经常包括频繁插入或更新活动和查询,它们经常返回小型数据集。假定随机访问,并且涉及一个或一些页面,预读就更少可能发生。 DMS表空间使用设备容器效果最好。如果不要求最大性能的话,那么有文件容器的DMS表或者SMS表空间也是可以作为OLTP工作负载的参考选择。需要很少或者不需要所期望的顺序I/O,CREATE TABLESPACE语句中的EXTENT SIZE和PREFETCH SIZE设置对于I/O效率来说不重要。然而,使用chngpgs_thresh配置参数来设置页面清除器的足够数目是重要的。 一个查询工作负载由需要对数据顺序或部分有序访问的事务特征化,并且经常返回大量数据集。一个使用多个设备容器的DMS表空间提供了高效并行预读的最大的潜力,这里每个容器都在不同的磁盘上。如图5-36所示,CREATE TABLESPACE 语句中PREFETCH SIZE参数的值应该设置为EXTENT SIZE参数的值乘以设备容器的数目。这就允许DB2从所有容器上并行预读。如果容器的号码改变了,或者需要让预读或多或少地侵入些,PREFETCH SIZE值就可以使用ALTER TABLESPACE语句相应地改变。如果这个文件系统有其自己的预读,那么一个查询工作负载的理想替换就是使用文件。这个文件可以是使用文件容器的DMS类型,也可以是SMS类型。如果使用SMS,就需要有目录容器映射,来分离磁盘以实现I/O并行化。 图5-36 表空间的设计 按照下面的步骤决定一个表空间的页面大小: , 对于执行随机行读取和写操作的OLTP应用程序,一个更小的页面大小经常是推荐 的,因为它节省缓冲池空间。 , 对于一次访问大量连续行的决策支持系统(DSS)应用程序,更大的页大小更好, 因为它减小请求读取一个指定的行数的I/O的次数。然而。行大小应该小于: pagesize / 255 每页上将有浪费的空间(每页最多255行)。在这种环境下更小的页大小可能更加 合适。 , 更大的页大小可以允许减小索引中的级别数。 , 更大的页支持更长的行。 , 在默认的4 KB页上表限制于500列,更大的页大小(8KB、16KB和32KB)支持 1012列。 , 表空间的最大 规格 视频线规格配置磁共振要求常用水泵型号参数扭矩规格钢结构技术规格书 与表空间的页大小成正比。 5.26 度大小 一个表空间的度大小表示在数据写入下一个容器之前将写到容器中的表数据的页的数目,如图5-37所示。 度大小 图5-37 度的大小 选择一个度大小时,应该考虑以下几点。 , 表空间中表的大小和类型。DMS表空间中的空间一次分配给表一个度。当表被复 制并且度变满了时,就分配一个新的度。如果可以进行多页文件分配,那么SMS 表空间中的空间一次分配一度。一个表由下面独立表对象组成: , 一个数据对象。这就是常规列数据所存储的内容。 , 一个索引对象。这就是表中定义的索引存储的内容。 , 一个长整数字符对象。这就是长整数字段数据所存储的内容。 , 两个大对象。如果有一个或多个大对象列,那么它们就存储了两个表对象。 , 大对象数据的表对象。 , 描述大对象数据的媒体数据的第2个表对象。 , 一个多维表的块映射对象。 如图5-38所示,每个表对象分开存储,并且每个对象按需分配新的度。每个表对象也使用名为度映射的媒体对象,来描述属于表对象的表空间的所有度。度映射的空间也是一次分配一度。 图5-38 表的对象 5.27 表空间和缓冲池的关系 每个表空间与一个特定的缓冲池相关。默认的缓冲池为IBMDEFAULTBP,如图5-39所示。如果另一个缓冲池要和一个表空间相关,这个缓冲池必须存在。缓冲池可以使用CREATE BUFFERPOOL语句定义。这个缓冲池必须有相同的页大小,并在建表时定义相关关系,可以使用CREATE TABLESPACE语句定义。表空间和缓冲池之间的关系可以使用ALTER TABLESPACE语句改变。拥有多个缓冲池允许配置数据库所用的内存,来改善整体性能。例如,如果有一个具有单个或多个表的表空间可以让用户随机访问,那么缓冲池的大小就可能是有限的,因为缓冲数据页可能不会有好处。一个在线事务处理应用程序的表空间可能与更大的缓冲池相关,这样应用程序所用的数据页可以缓冲得更长时间,这就促进更快的响应。必须小心配置缓冲池。 图5-39 表空间和缓冲池的关系 在DB2缓冲池中包括三类页:正使用的(in-use)、已更新的(updated)和可用的(available): , 正使用的页 这些页正在被读取或者正在被修改。 , 已更新的页 这些页是更新过了的,而且还没有被写入DASD之中。 , 可用的页 这些页是要用的、并且还没有被包含新数据的页所覆盖的页。正使用的页和已更新的页都是不可用的页。 在DB2中有两种页面集:数据页面集和索引页面集。数据页面集包含表空间的VSAM线性数据集,而索引页面集包含索引空间的数据集。在页面集中有三种页面:头页面、数据页面和空间映射页面。如果表空间是压缩的,那么还有字典页面。 零页面指一个页面都是零,一般可以在页面集的末尾或段的末尾找到零页面。零页面也可以放到最后的字典页面之后。以下情况可以生成零页面。 , 任何表空间的末尾都有零页面,它位于最后的数据页面和下一个磁道限制之间。 , 在分段的表空间的最后一段中存在零页面。 , 压缩分段的表空间在最后的字典页面和第一个数据页面之间可以有零页面。 一旦格式化一个页面之后,它就会保持格式化并且在删除数据之后就变成空页面,但它不会变成零页面。但在某些条件下,取消一个作业会产生零页面。例如,当几个应用程序同时访问相同的页面时,又试图按照簇键插入数据时,就会发生这种情况。如果采用了页面级锁机制并同时访问了相同页面,而它们不会被阻塞,而是在多个页面中插入数据。如果一个应用程序锁定页面之后以及格式化页面之前取消它,并且其它应用程序已经格式化了其后的页面,那么取消的应用程序就会留下一个零页面。 DB2更新缓冲池中的页面时采用了一种破页面的技术。其工作过程是,在表空间页面有两个标志:一个标志在页面的头部,另一个在页面的底部。当开始更新时,头部的标志取反,这样就使得页面的两个标志值不同,即这个页面变为破页面。DB2进行所有的更新, 包括把数据行重组,来移动空间到页面的底部。更新完DB2之后,底部标志也要取反,即两个标志要相同。这样破页面又变成了正常页面。破页面不能被写引擎写入磁盘,它们只能存在于缓冲池中,不会出现在磁盘上。 DB2支持多个内存缓冲池。数据库管理员可以同时创建多个不同大小的缓冲池后将它们指向特定的表格空间,就象大型机DB2用户一样非常细致地控制内存使用,这对提高交易应用的在线响应时间会产生很大效益。 要把表空间中的表对象分配到各个缓冲池中去,要遵循以下性能优化的指导原则。 , 所有DB2系统类目(catalog)和目录(directory)对象应该为BPO中的仅有对象。 把额外对象加入到只会引起所有对系统类目和目录访问的性能问题。这个缓冲池应 该相应地加以分配,并且不浪费空间。 , DSNDB工作文件表空间需要有自己的缓冲池,并且还要相应地设置一些阈值。 , 总是把表空间和索引分开,即把随机访问的对象和顺序访问的对象分开。 , 把只读对象中有很多引用的和没有被引用的对象分开。类似地,把有更新活动的对 象中有大量引用的和只有少量引用的对象分开。 , 代码和引用表可以放在一个分离的缓冲池中,而且可以使它们驻留在内存中,以获 取更好的性能。 , 支持软件工具的提供商对象应该被隔离在自己的缓冲池之内。 , 把大对象放在自己的缓冲池中可以更好地加以调节。 , 分级(staging)表有自己特有的性质,把它们放在各自的缓冲区中,可以获得更好 的性能。 为了获得最佳的系统性能,需要确定好一个缓冲池的合适的大小。为了确定一个缓冲池应该有多大,就需要确定在缓冲池中对象所在的页会驻留多久。也就是说一个页需要被保留多长时间来等待被引用。一个缓冲池中被请求的页数的数目由每秒钟写缓冲池的次数乘以平均每页引用的时间来决定。 5.28 临时表空间设计 推荐定义一个单一的SMS临时表空间,使得其页大小等于大多数常规表空间中所用的页大小,如图5-40所示。这对于典型环境和工作负载是适用的。然而,试用不同的临时表空间配置和工作表负载更好。 图5-40 临时表空间的设计 设计临时表空间时注意以下几点事项。 , 临时表在大多数情况下都可以批量顺序访问。那就是说,插入一批行,或者读取一 批顺序行。因此,更大的页大小促进了更好的性能,因为读取给定数量的数据要求 更少的逻辑或物理页I/O请求。当普通临时表的行大小小于页大小除以255的商时 情况也不完全如此。无论页有多大,最大255行对于每页都限制。例如,一个需要 15字节行的临时表的查询能够被一个4KB的临时表空间页大小服务,因为255这 样的行可以全部包含在一个4KB的页中。 , 如果数据库中大于百分之五十的常规表使用相同的页大小,那么使用相同的页大小 定义临时表会更好。原因是这样安排有助于临时表和大多数或者全部常规表空间一 起共享相同的缓冲池空间。这样反过来也简化了临时表的设计。 , 当使用一个临时表空间重新组织一个表时,这个临时表空间的页大小必须与这个表 的页大小相匹配。正因为这一点,应该确保对于可能使用临时表重新组织的现存表 所用的每个不同的页大小,都定义临时表空间。 也可以无需临时表在目标表空间重新组织表目录。当然这需要在目标表空间中有额外的空间以备用。 , 一般来说,当不同页大小的临时表空间存在时,优化器主要经常使用最大的缓冲池, 来选择临时表空间。 , 定义多个具有单一页大小的临时表空间一般没有好处。 , 设计临时表空间时,SMS几乎总是比DMS要行,原因如下: , 使用DMS而不是SMS,更不利于创建临时表。 , 在SMS中磁盘空间是按需分配,而在DMS中是预先分配。预先分配是困难 的。 , 数据库管理员试图把临时表页保存在内存中,而不是写到磁盘里面。结果是, DMS的性能优点差一些。 5.29 类目表空间设计 推荐使用SMS表空间,如图5-41所示,作为数据库类目,原因如下。 , 数据库类目由许多不同大小的表组成。当使用一个DMS表空间时,两个度的最小 值就分配为每个表对象。根据所选的度大小,相当数量的已分配并未用的空间就有 结果了。使用一个DMS表空间时,应该选择小量的度大小(2到4页),否则,应 该使用一个SMS表空间。 , 在类目表中有大对象(large object,LOB)列。大对象数据不会和其它数据一起保 存在缓冲池里,但是每次需要时可以从磁盘中读取。从磁盘读取大对象会降低性能。 因为一个文件系统经常有自己的缓冲区,使用一个SMS表空间或者一个基于文件 容器的DMS表空间,如果以前引用过这个大对象,就可以避免。 图5-41 系统类目表空间 给定这些考虑,一个SMS表空间对于这个类目来说就是一个稍微更好的选择。要考虑的另一个因素就是将来是否需要扩大这个类目表。虽然一些平台已经支持扩大对SMS容器的潜在支持,并且可以使用改向恢复来扩大一个SMS表空间,一个DMS表空间的使用就方便了新容器的添加。 如果把经常访问DB2子系统的系统类目放入到SMS多卷数据集中,就会有一个隐含的性能问题。推荐对经常访问的关键DB2资源使用连续的大数据集。DSAD的多卷、多扩展比单卷、单扩展要花更多时间和I/O操作。虽然DB2可以用二级分配来操作系统数据集的多卷数据集,但是对性能要求很高的系统类目不推荐这么做。 用于确定何时重组应用程序表空间和索引空间的技术,同样也可以用来确定何时重组表空间和索引空间的系统类目。 , 首先要确保使用RUNSTATS进行统计,这样就可以根据当前的统计数据做出重组 决定。当把对象放入到扩展中或者要回收没有使用的空间时,就需要重组。 , 在OS/390上,由于复杂的链表结构和系统类目的内部哈希结构,使得DB2系统类 目的重组只能对DB2最新版本有效。如果在正常情况下没有重组系统类目表,那 么用户和系统对系统类目的查询性能就会下降。所有在DSNDB06数据库中的表空 间都可以被重组。 , 在OS/390上,对DB2系统类目的重组是很重要的,因为DB2包含了内部控制和 结构的重要信息。这些对DB2处理是非常重要的,因为它们会影响应用程序的访 问计划、数据报执行、工具的执行和数据库的访问。 , 要记住DB2系统类目与DB2目录表之间有一定的关系。比如,在重组系统类目 SYSDBASE时,就会重组目录DBD01,在重组系统类目中SYSPLAN和 SYSPACKAGE时,就要分别重组目录中的SCT01和SCT02。 在DB2系统类目上经常需要运行RUNSTATS ,这主要是因为DDL、DML和其它可能会在系统类目中进行插入和删除操作的命令。如果在当前表空间和索引空间中没有运行RUNSTATS,就不能正确地优化查询。这同样适合于用户自定义的对象。经常需要重组表空间和索引空间的系统类目,来反映当前所有对象的情况。 有时需要减少DB2系统类目的冲突,可以选择如下方法。 , 使用DB2系统类目的映射拷贝。 , 尽可能将访问限制到优化过的查询或视图上。 , 调度操作,如调度DDL操作以避开高峰期。 , 调度经常访问系统类目的工具以避开高峰期。 , 根据动作对系统类目的影响确定系统类目是否在正常情况下重组。 , 保证经常运行RUNSTATS,使得动态查询可以使用最新统计。 , 保证DB2系统类目上所有的索引是类型2。 5.30 当数据在RAID设备上的时候,优化空间性能 这一节描述当数据放在独立磁盘冗余组(RAID)设备上时如何获取最优性能。在设备之间放置数据会在多个方面影响性能。多路径访问数据是有好处的。这样,把数据放置到不同的设备上,可以在存取和处理数据上大大提高并行处理能力。 步骤 对于使用RAID设备的表空间,按照下面的步骤进行: , 使用RAID设备,定义这个表空间的单一容器。 , 使得这个表空间的EXTENT SIZE等于或者倍数于RAID类别的大小。 , 确保这个表空间的PREFETCH SIZE为: , RAID类别大小乘以RAID并行设备的数目或者是这个产品的整个乘积和 , EXTENT SIZE的乘积 , 使用DB2_PARALLEL_IO注册变量,来使能这个表空间的并行I/O。 , DB2_PARALLEL_IO。 当从表空间容器读取数据或者写数据到表空间容器时,如果数据库中的容器数目大于1,那么DB2就可以使用并行I/O。然而,并行I/O有可能有利于单个容器表空间。例如,如果在由多个物理磁盘组成的单个RAID设备上创建这个容器,就要发出并行读写的调用。 要强制一个单容器的表空间的并行I/O,就可以使用DB2_PARALLEL_IO注册变量。这个变量可以设置为“*”,意思是对于每个表空间,或者它可以设置为一组逗号隔开的表空间Ids。例如: db2set DB2_PARALLEL_IO=* {转换所有表空间上的并行I/O } db2set DB2_PARALLEL_IO=1,2,4,8 {转换表空间1、2、4和8上的并行I/O} 设置注册变量之后,必须停止DB2(db2stop),然后重新启动DB2(db2start),这样改变才能生效。DB2_PARALLEL_IO也影响定义了多个容器的表空间。如果还没有设置注册变量,I/O并行化就和这个表空间中的容器数目相等。如果设置了注册变量,I/O并行化就和度大小分割的预读大小的结果相等。如果表空间中的独立容器被多个物理磁盘分类,那么就可能要设置注册变量,如图5-42所示。 图5-42 表空间的存储管理 使用预读就是允许数据和索引页面在使用它们之前从磁盘中拷贝到缓冲区中,这样可以大大减少I/O时间。如果数据放在不同的设备上,预读的效果就会更加明显,特别是当表要访问大量数据时。通过定义DMS的表空间并在不同的磁盘上设置容器来达到这个目的。 例如,一个表空间有两个容器,而预读大小为度大小的四倍。如果还没有设置注册变量,这个表空间的预读请求就分裂为两个请求,每个请求将是两个度。假定预读器可以工作,那么两个预读器可以按照并行请求工作。在注册变量设置好了的情况下,这个表空间的预读请求将分裂为两个请求,每个请求一个度,可能会有四个预读器处理并行的请求。 在这个例子中,如果这两个容器中的任何一个都有单个专门的磁盘,设置这个表空间的注册变量可能就会导致那些磁盘的冲突,因为两个预读将会立即访问这两个磁盘中的每一个。 DB2_USE_PAGE_CONTAINER_TAG 默认情况下,DB2使用每个DMS容器(文件或设备)的第一个度,来存储一个容器标记。容器标记是DB2容器的元数据。在DB2的早期版本中,第一页用来作为容器标记,以后容其中作为标记的空间越来越少。对于DB2的早期版本,DB2_STRIPED_CONTAINERS 注册变量用来创建具有度大小标记的表空间。然而,由于现在这是默认行为,这个注册变量不再起作用了。当注册变量DB2_USE_PAGE_CONTAINER_TAG设置为ON时,默认地将会使用一页的标记创建任何新的DMS容器。这不会对注册变量设置之前创建的现有容器造成冲突。不推荐设置注册变量为ON,除非空间容器非常紧张,或者需要采用与版本8以前的早期版本一致的行为。 如果RAID设备用于表空间容器,那么设置这个注册变量为ON会对I/O性能造成负面影响。当使用RAID设备作为表空间容器时,建议使用RAID类别大小的等值或者倍数作为度大小,来创建这个表空间。结果就是更多的物理磁盘将会得到最优化。因此强烈建议用户不要设置注册变量。 要创建一页容器标记的容器,就要设置这个注册变量为ON,然后停止并重新启动这个实例: db2set DB2_USE_PAGE_CONTAINER_TAG=ON db2stop db2start 要停止创建一页容器标记的容器,就要重置这个注册变量,然后停止并重新启动这个实例。 db2set DB2_USE_PAGE_CONTAINER_TAG= db2stop db2start 控制中心、LIST TABLESPACE CONTAINERS命令和GET SNAPSHOT FOR TABLESPACES命令不会显示是否已经使用一页或度大小标记创建了一个容器。根据创建容器的方式,它们使用标签“文件”或“设备”。要证实是否使用一页或度大小标记创建了一个容器,就可以使用DB2DART的/DTSF选项,来倒空表空间和容器信息,然后看这个容器的类型域来寻求解答。可以使用查询容器APIs (sqlbftcq和sqlbtcq),,来创建显示这个类型的简单应用程序。 5.31 当选择表空间的时候需要考虑的事项 DB2分配表空间空间十分灵活。在不停止数据库运行的情况下,通过增加更多的设备或存储空间,系统管理员可以增大表空间。为了获取最佳的性能,对表空间中的数据可以自动进行动态平衡,如图5-43所示。另外,数据库管理员对存放数据的位置具有更大的灵活性。例如,可以把同属一个表的数据、索引和LOB分别放在不同的表空间中,比如:把索引放在I/O速度快的硬盘上,从而获得最佳的性能。 图5-43 DB2的内存使用情况 当决定如何把表映射到表空间时,应该考虑以下几点事项。 , 表的分区 至少应该确定所选的表空间在要分区的数据库分区组里面。 , 表中的数据量 如果打算在表空间中存储许多小表,就要考虑使用那个表空间的SMS。具有I/O 和空间管理效能的DMS特点对于小表不是很重要。SMS一次分配一页空间、按需分配的优点对于小表来说更有吸引力。如果有一个表大一些,或者需要加快对表中数据的访问,那么一个具有小度大小的DMS表空间应该值得考虑。 SMS(System-managed Storage)和DMS(Data-managed Storage)的主要区别如下。 对于SMS: , 在创建表空间之后不可以添加容器。 , 一个表的数据、索引和大对象只能存储在一个表空间中。 , 定义容器的空间不是预先分配的,会随着数据需求的增加而增加。 对于DMS: , 可以使用ALTER TABLESPACE在表空间中添加新的容器。 , 一个表的数据、索引和大对象可以存储在不同的表空间中。 , 必须在创建容器时加以分配容器的空间。 对于每个非常大的表,可以使用一个分开的表空间,然后把所有小表组合在一个表空间之内。这种分离也允许基于表空间的使用情况选择一个合适的度大小。 , 表中数据的类型 例如,可以有包含频繁使用过的历史数据的表,终端用户可以为对这个数据的查询接受一个长时间的响应。在这种情况下,能使用为历史表使用一个不同的表空间,把这个表空间分配到更廉价的更少访问率的物理设备上。 , 管理问题 可以在表空间层而不是数据库或表层执行一些管理功能。例如,使用一个表空间的备份来代替一个数据库,这样可以有助于更好使用时间和资源。允许经常备份大卷改变的表空间,而偶尔备份小卷改变的表空间。
本文档为【第05章 物理数据库设计.doc】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_083599
暂无简介~
格式:doc
大小:813KB
软件:Word
页数:0
分类:生活休闲
上传时间:2017-12-01
浏览量:3