一、简介 本文的目的是为IBM业务伙伴提供关于
DB2 Universal Database(UDB)for z/OS(后面将简称为
DB2)环境中
DB2数据库性能的重要信息。本文试图从多处收集材料,并尽可能有效地将它们表述出来。本文无意包含很全面的范围,也不会包含很深的细节。
我曾打算讨论对
DB2数据库的性能影响最大的一些因素。但是,并不是所有可能的情形都可以预测到,也不是所有潜在的考虑都能顾及到,更不用说在期望的范围内对它们进行描述了。我希望本文可以为不同环境下的
DB2用户提供一个通用的指南,以帮助他们取得最佳的
DB2数据库性能。本文的目的是成为一个良好的起点,用以处理任何给定安装环境下的数据库性能问题。
本文的范围是数据库设计性能。
DB2性能远不止这一部分,它肯定要受到数据库设计以外的很多因素的影响。例如,程序的编码逻辑和其中使用的实际的SQL语句,可以列为应用程序设计一类。
DB2系统性能可以包括诸如安装选项、缓冲池大小设置、
DB2相关地址空间的调度优先级等等之类的因素。
本文的焦点是
DB2数据库的设计。不过,有时候这些性能因素类别之间的界线可能会有些模糊。例如,在某种安装环境下进行配置时,缓冲池大小的设置和数量的选择通常被认为是一项系统性能因素。但是,倘若是将特定的表空间和索引指派给那些缓冲池,那么这些因素又可以看作是数据库设计一类的因素了。
在这里,我假设读者对z/OS环境中的
DB2有一个基本的理解。本文的头几页将讨论性能管理的一些基本概念和准则,以便进行“级别设置” 。我的建议有点综合的性质,因而不会总是详细地给出技术性的描述和语法。读者如果想了解关于这些内容的更详细的信息,那么应该去阅读关于用户本地所安装的
DB2版本的最近的IBM文档。
本文的通用设计点是
DB2 for z/OS V7。虽然
DB2 for z/OS V8已经被宣布,并且也普遍可用(generally available ,GA),但是大部分IBM客户极有可能需要几个月的时间才能实现用于他们的生产系统的
DB2 V8 NFM(New Function Mode)。而且,这里还要考虑另外一个因素。虽然
DB2的每个新版本在变得普遍可用之前,都已经在IBM及其客户环境下经过了广泛的测试,但是相对于一个还没有推广的、没有普遍使用的版本而言,客户们往往对于基于早先版本的
DB2的一般建议和窍门更有信心(长时间积累的经验验证了这一结论)。我将提到
DB2 V8的一些新特性,从性能的角度来看,这些新性能可能会影响数据库设计。
免责声明:本文中所包含的信息未经任何正式的IBM测试,而是以AS IS的形式发布的。对这些信息的使用和其中任何技术的实现,都由用户承担责任,并取决于用户的能力去评价它们和将它们整合到客户特有的操作环境。虽然IBM对于每一项都进行了审查,以求特定情况下的正确性,但不能保证在其他情况下也能得到相同的或类似的结果。试图将这些技术应用于他们自身环境的用户须自己承担风险。
二、性能准则和方法学 1. 何时考虑性能
考虑应用程序和数据库的性能特性的时机是在那些应用程序和数据库的初期设计阶段,也就是开发过程的开始阶段。对
DB2应用程序和数据库所需的资源进行合理的估计,这有助于用户在开发过程的早期便对设计和实现作出恰当的决定。如果等到后期才来考虑访问数据库的应用程序的性能,那么为了取得适当的响应时间和生成批处理窗口而进行一些必需的修改时,就会更加困难,而且更加消耗时间。
2. 应该关注些什么
当从性能的角度进行设计时,将大部分的精力集中在重要
DB2数据和程序上,这种做法比较明智。在确定是什么应用程序或事务构成这一重要的工作负载时,以下特征中的一条或几条将会适用:
1) 它们代表了总体业务工作负载的很大的百分比。
2) 它们有着关键响应时间需求。
3) 它们包括复杂的逻辑和/或数据访问需求。
4) 它们访问大量的数据。
5) 它们消耗大量的资源。
6) 与那些属于公司内部的应用程序相比,它们是直接与客户打交道的(通过 Web、ATM 等)。
3. 数据库设计
数据库的设计有两个阶段:
1) 逻辑数据库设计
2) 物理数据库设计
数据库的逻辑模型仅仅是对用户的所有数据需求的一种表示,它将这些需求变成一种范式。这种模型通常就是数据建模会议的输出或最终结果。该模型实际上很少被原原本本地实现。其实,该模型只是在考虑如何实际地构造数据和将数据存储在DBMS之前,对数据的一种理想化的看法。
在对数据库对象的架构进行了考虑之后,逻辑模型就被转化为物理模型。在设计的这个阶段,就需要较为详细地考虑数据访问需求和性能因素。在产生物理设计的这个过程当中,有两大要素,即表设计和索引设计。下面将较为详细地讨论这两个话题。
4.
DB2性能管理的方法
为了确保
DB2应用程序具备合格的性能,未雨绸缪胜于亡羊补牢。在设计
DB2数据库的早期阶段就将性能因素考虑进来,这一点很重要。然后,在项目尽可能早的时候,建立一套符合Service Level Agreement(SLA) 的性能“基准线”测量方法,这样,便可以在展示的时候和应用程序被修改的时候,跟踪性能特性和趋势。同时还应该持续地监控
DB2系统和应用程序,从而在大的问题完全发作之前进行预测。
通常,很多客户只有到了应用程序开发项目的最后阶段才开始担心性能。但是通常没有什么好的理由需要等到那时才去考虑性能。更好的做法是,在指定了用户界面和处理逻辑之后,立即考虑数据库设计的性能特性。例如,在创建最佳索引时,应该将重要
DB2工作(请参阅前面的讨论)中SQL语句的谓词作为主要指南。
即使您可以开发一个有效的初期设计,随着数据量的增加,或者在系统资源紧缺的时候,也仍有必要对应用程序和/或数据库作出修改。如果一个应用程序执行时的性能不合格,较为可取的做法通常是添加更多的列到现有的索引中,或者为一个表添加新的索引,这种做法是首选。而更改表的设计,或修改用户需求,抑或修改反规范化(de-normalizing)表,都不是很有吸引力的选择。
三、理解DB2性能 1. Rules-of-thumb
Rules of thumb(经验法则,也称ROT)在规划、监控和优化
DB2性能的时候很有用。ROT通常是基于以前的经验(比如在一段时间内观察到的平均值)或者更复杂公式的简化。
记住这样一个事实很重要,即ROT只对于粗略的估计有用,而对于详细的分析用处不大。如果只是在某一类的文档中看到了一些ROT,便欣然接受并作为精确的事实来引用,那么就会有危险。在最好的情况下,这些ROT是一种估计,而在最坏的情况下,这些ROT对于特定的
DB2环境可能不成立。
您应该为自己的环境特别开发这些ROT(或者对它们进行调节,以适应自己的环境的特性)。应确保ROT与实际经验相关,而不是盲目地接受,这样才能对它们更有信心。一开始的时候,使用那些在您特定环境以外被使用过或者被开发出来的ROT,这种做法可能有用。但是,当对您自己
DB2系统中的适当数据进行收集、分析和编制文档之后,应该对这些ROT加以验证和修改。IBM Redbooks是关于ROT的一种很好的参考资料,这些ROT常常作为建议被包括在性能监控工具中。
另一方面的考虑是,ROT可能随着时间的推移而演变。硬件技术的发展,软件编程技术的提高,系统架构的变化,诸如此类的变化都可能使得ROT的可靠性降低,甚至变得无效。而使ROT随着时间变化的最大因素也许正是
DB2本身新版本的发行。
2.
DB2工作负载
磁盘I/O常常是影响响应时间的最大因素,但是通过查看GETPAGE(GP)请求,更容易理解底层的性能问题。当监控
DB2活动和分析报告时,GETPAGE的数量也许是
DB2总体工作负载的最好的指示器。
某个安装环境下的很多
DB2工作都可以无异议地归为以下几类:
1) 事务:事务是在事务管理器(例如CICS和IMS/TM)控制下运行的程序。其中的SQL通常比较简单,但是事务量比较重。事务必须为用户提供极好的响应时间,这样应用程序才不致于要长时间地等待它们所需的资源。通常,第一个调用事务的用户将承受读取索引和数据页的成本。随后的用户则常常可以发现有些资源已经在缓冲池中。
2) 查询:查询也是程序,常常在需要决策支持时执行它。其中的SQL可能非常复杂,但是工作量常常远不及事务。查询的用户常常要等上数分钟甚至数小时,这取决于为了产生用户所请求的结果集,需要对多少数据进行搜索。查询常常要引起对整个表的扫描,而对结果排序是这种类型的工作负载的另一种常见特征。
3) 批处理和实用程序: 批处理和实用程序通常处理大量的数据,并且常常以一种连续的方式处理数据。这些程序在给定的窗口中完成它们的处理,这一点很重要。批处理和实用程序往往是各种系统资源的消费大户,一旦它们挤在一起,常常会使工作负载逐步上升。
3. 规范化
规范化是分析应用程序所需的数据实体,然后将这些数据实体转化成一组设计良好的结构的一个格式化的过程。逻辑数据模型的一般设计目标是正确性、一致性、非冗余和简单性。而且,关系理论的信条也要求数据库要经过规范化。
有一些按照连续编号排列的规则(也叫 范式(form))可以用来很详细地定义规范化数据。大多数专家都会建议设计者尽量遵从前三条规则,由此得到的数据就可以说是符合第三范式。
而将一个表反规范化(de-normalize)的意思是,违反该表之前遵从的一种或多种范式,从而修改规范化的设计。这种反标准化的过程常常是由于性能的原因而进行的。在大多数以关系数据库为主题的书籍当中,都可以找到关于规范化的更详细的信息。
4.
DB2表空间类型
在一个定义好的
DB2数据库中,实际的表必须在称作表空间(table space)的
DB2对象中创建。用户可以在
DB2中定义4种不同的表空间:
1) 简单表空间:简单表空间可以包含一个以上的
DB2表。这种表空间由页构成,每个页可以包含该表空间中定义的任何表中的行。
2) 分段表空间:分段表空间可以包含一个以上的
DB2表。这种表空间由页组构成,页组被称作段(segment)。每个段只能包含该表空间中定义的一个表中的行。
3) 分区表空间:分区表空间只能包含一个表。根据分区(partitioning)索引的键范围,这种表空间被分成数个分区。每个分区都被看作一个独立的实体,允许SQL和
DB2实用程序对其进行并发处理。
4) LOB表空间:LOB 表空间只用于LOB(大型对象)数据。LOB包括三种数据类型:BLOB(二进制大型对象)、CLOB(字符大型对象)和DBCLOB(双字节字符大型对象)。