5. 数据压缩
4) 对压缩的估计:DB2提供了一个独立的实用程序DSN1COMP,通过执行该实用程序可以判断压缩数据的效果。要了解关于运行该实用程序的更多信息,请参考DB2 Utilities Guide and Reference手册。
6) 更好的字典:当使用LOAD实用程序来建立压缩字典时,DB2使用所装载的前n行(其中n取决于数据的压缩程度)来决定字典的内容。REORG使用一种抽样技术来建立字典。它不仅使用所装载的前n行,而且还会对该实用程序执行期间剩下的UNLOAD阶段中的行进行抽样。因此,REORG常常可以产生更能代表整个表空间或分区中的数据的字典。
如果您的环境可以从压缩中得到好处,通常我们建议压缩那些DB2表空间和分区,因为由于更少空间容纳更多数据所带来的性能优势几乎总是大于压缩和解压数据时所需的CPU资源消耗。
6. 装载大型的表
五、索引设计方面的考虑
索引也是一种
DB2对象(一个单独的VSAM数据集),它由一组排好序的键组成,这些键是从相应表中的一个列或多个列抽取出来的。很多DB2专家声称,只有为表空间建立恰当的索引,才是使得访问该表空间中DB2数据的应用程序的性能达到最佳、最有效的效果。数年前,在I/T中DASD的成本和空间是更重要的考虑因素。随着技术的发展,通过增加更多的索引(或添加列到已有的索引中)来减少I/O,以及由此消耗的额外磁盘空间,这几年两者之间的权衡已经变得越来越有吸引力。索引所带来的主要性能好处是:
1) 提供指向表中被请求的数据行的直接指针。
2) 如果结果集要求的顺序与索引一致,则可以消除排序。
3) 如果被请求的列都包含在索引项中,则可以避免不得不读数据行的情况。
1. 分区索引
在DB2 UDB V7中创建分区的表空间时,DB2根据CREATE INDEX语句的PART子句将数据划分到几个分区上。那样的索引就成为所谓的分区索引,而这种分区的方法就被称为 索引控制的分区(index-controlled partitioning)。对于分区索引,建议选择不大可能改变的键列。如果对那些列进行更新,则可能导致一行从一个分区转移到另一个分区,从而降低了性能。
DB2 V8一个重要的特性是表控制的分区(table-controlled partitioning)。这时,当创建分区的表时,分区的边界由CREATE TABLE语句决定,而不是由CREATE INDEX语句决定。对于索引控制的分区方法,分区的表、分区索引和群集这几个概念之间有点纠缠不清。而在表控制的分区方法中,这三个概念是各自独立的。这种增加的灵活性使您可以考虑更多潜在的设计方案,因而也增加了提高DB2
数据库及其应用程序性能的机会。
2. 何时建立索引
CREATE INDEX语句使用户可以立即建立索引,或者将索引的建立推迟到方便的时候。如果立即建立索引,则需要扫描表空间,这样要花费比较多的时间。通过指定DEFER,则可以推迟索引的创建。
只要有可能,应该在初次装载一个表之前创建其所有索引,因为LOAD实用程序建立索引的效率比CREATE INDEX过程要高。如果需要在一个已有的(并且被填充的)表上创建一个索引,那么可以使用DEFER子句。然后可以在晚些时候使用REBUILD INDEX实用程序,这个实用程序与LOAD实用程序一样,是更为有效的填充索引的方式。
3. PIECESIZE
DB2 UDB V5中引入了一个新特性,这种特性使您可以将一个非分区索引(non-partitioning index,NPI)拆成数块,然后控制将组成索引空间的多个数据集的大小。通过使用这些小块,可以使NPI的索引页散步到多个数据集中。
通过在CREATE或ALTER INDEX语句中指定关键字PIECESIZE,可以确定各块的大小。PIECESIZE的值必须是2的幂,其大小可以介于256KB到64GB之间。对于常规表空间,PIECESIZE的默认值是2GB,对于LARGE表空间,默认值是4GB。如果NPI极有可能显著增长,那么应选择一个更大的值。在为主空间和辅助空间(CREATE INDEX语句的PRIQTY和SECQTY选项)的分配确定值时,也应该留意PIECESIZE的值。
通过使用这个选项,可以促进并行性,从而提高NPI的扫描性能。另一个好处是可以减少在读或更新的处理过程中对I/O的争用。通过指定一个较小的PIECESIZE,可以创建更多的块,从而对块的放置有更多的控制。将这些块放在不同的I/O路径中,可以减少访问NPI所需的SQL操作的争用。
4. 理想的索引
通过检查应用程序中的SQL语句,可以建立一种想象起来很好的索引。
1) 首先,在索引中包括WHERE子句中的所有列,这样,就可以使用索引形成的屏蔽来拒绝结果集中不合格的行。将这些列放在索引的开始部分。这样一来,当对SQL语句进行EXPLAIN时,就可以产生最大的MATCHCOLS值。
2) 接下来,确保索引中这些列有适当的顺序(按照ORDER BY子句),这样可以避免排序。在进行EXPLAIN时,通过检查PLAN_TABLE中所有不同的SORT*列,便可以确认这一点。
3) 最后,如果可能的话,将SELECT中所有的列包括到索引当中,这样就不需要访问表中的行。这样的索引项可以提供所有被请求的数据。这在EXPLAIN中就表现为INDEXONLY = Y。
在很多情况下,实现这一理想的代价太高,也不切实际,甚至是不可能的。对于一个索引中可以包括的列数,以及整个索引项的长度,都有架构上的限制(虽然这些限制已考虑到相当大的索引项长度和灵活性)。而且,也要考虑索引维护的成本。虽然建立理想化的索引可以显著提高查询性能,但是每当对DB2数据库执行SQL写操作(INSERT、UPDATE 或 DELETE)时,上述理想化的索引都会有负面的影响。因此,您常常可以选择实现只包括在WHERE和ORDER BY子句中引用到的列的索引。
[/page]
六、并行处理方面的考虑
这些年,
DB2通过实现各种并行处理的方法,已经大大提高了访问数据的性能。为了提高数据密集型只读查询的性能,DB2 V3引入了查询I/O并行。在这种并行中,DB2充分利用分区表空间促成的可用I/O带宽。通过这种方法,DB2可以为单个I/O请求启动多个并发的I/O请求,并在多个数据分区上执行并行I/O处理。这通常可以显著减少I/O bound查询所需的时间,而代价只是稍微增加的
CPU时间。
DB2 V4引入了另一种并行技术,这种技术称作查询CP并行。这种方法将并行处理扩展到过程密集型(process-intensive)查询中来。通过这种方法,一条查询可以使DB2生成多个任务,这些任务被并行地执行,以访问数据。分区表空间最能体现这种并行所带来的性能提高。
DB2 UDB V5引入了sysplex查询并行,进一步扩展了并行处理。CP并行可以在DB2子系统中为一条查询使用多个任务,而sysplex查询并行这种方法使一个DB2数据共享组中的所有成员可以一起处理一个查询。对于那些主要是只读形式的I/O密集型和
处理器密集型查询,都可以从这种并行中得到好处。
1. 支持并行访问
DB2环境中对并行的支持有一个度的
问题。首先,在DB2子系统级,并行访问是在安装面板DSNTIP4上控制的。DSNTIP4上的MAX DEGREE选项决定了最大并行度(并行任务的最大数量)。默认值是0,这意味着对于DB2可能调用的并行度没有上限。我建议您先估计z/OS环境中的虚拟存储能力和局限性,这样DB2就不至于创建多于虚拟存储所能处理的并行任务。
您可以通过BIND PLAN和BIND PACKAGE命令的DEGREE选项来控制DB2是否利用并行处理。若指定DEGREE(1),表示禁止并行处理,若指定DEGREE(ANY),则表示支持并行处理。为获得更大的灵活性,动态SQL允许通过SET CURRENT DEGREE语句在一个计划或包中更改这个选项,该语句可以控制专用寄存器中的值。
当一个计划或包与DEGREE(ANY)捆绑在一起,或者CURRENT DEGREE寄存器被设为ANY时,DB2优化器将考虑对于最有效的顺序计划,并行是否可行。如果并行不可行,那么就选择次好的顺序计划。
2. 限定分区扫描
限定分区扫描允许DB2将数据扫描限制在一个分区表空间中。根据SQL谓词中的值,DB2可以判断可能包含SQL语句所请求的表行的最低分区和最高分区,然后将数据扫描限制在这一范围内的分区中。为了使用这种技术,SQL必须提供分区索引的第一个键列上的一个谓词。
3. 并行方面的建议
为了进一步促进并行处理所能带来的性能提高,下面列出了一些需要考虑的事情:
1)尽可能均匀地对表空间分区,因为数据不整齐会对并行度产生影响。一般来说,DB2根据最大物理分区的大小将表空间分成逻辑上的几块。
2) 为DB2应用程序的处理分配尽可能多的中央处理器(central processor,CP),以及尽可能多的 I/O 设备和路径。
3) 对于I/O密集型查询,应确保分区的数量与可以访问该表空间的I/O路径的数量一致。
4) 对于处理器密集型查询,应确保分区的数量等于将被分配用来在数据共享组上处理查询的CP的数量。
5) 将用于表空间和索引的分区放在单独的DASD卷中,并且,如果可能的话,要隔开控制单元,以减少I/O争用。
6) 按时执行RUNSTATS实用程序,以获得分区级的统计信息。
7) 监控虚拟缓冲池的阈值和使用情况,确保提供了足够的缓冲池空间来最大化并行度。