简介
性能是关系到随需应变型应用程序成功与否的关键。当那些应用程序使用 IBM® DB2 Universal Database™ 作为数据存储时,至关重要的是,从一开始就应该知道有关如何在 DB2 UDB 上取得尽可能好的性能的基础知识。在本文中,我将给出关于调优 DB2 UDB V8 系统的一些比较深入的建议。
我们将谈论这一过程中自始至终存在的性能问题。您可以遵循从创建一个新数据库到运行应用程序这之间的流程。通过本文可以看到如何使用 DB2 自动配置实用程序来初始配置数据库管理器和数据库环境。接着,我将讨论创建缓冲池、表空间、表和索引的最佳实践。另外,您可能还想改变一些重要配置参数的初始值,以便更好地支持应用程序,因此我们还将简介这些配置参数。
我们将论述基于监视器(monitor)细节输出的调优,从而展示如何使用快照监视(snapshot monitoring)帮助调优 SQL、缓冲池和各种不同的数据库管理器以及数据库配置参数。接着,我们将进一步研究应用程序发送给 DB2 的 SQL。通过使用 Explain,可以生成 SQL 采用的访问计划(access plan),并寻找可以进一步优化的机会。我们将考察 Design Advisor 这样一个工具,它可以根据所提供的 SQL 负载推荐出新的索引,或者评估现有的索引。最后,我们还将讨论一些 DB2 SQL 选项。
此外,持续(on-going)维护对于维持最佳性能非常重要。所以我们将讨论一些可以帮助我们进行持续维护的实用程序。对于那些正使用 DB2 ESE Database Partitioning Feature (DPF) 的读者,我会用一节的篇幅谈论为使数据库高效运行而应该考虑的一些问题。有时候可能会存在某种外在的瓶颈(来自 DB2)而使您无法达到性能目标,本文列出了一些常见的瓶颈,以及用于监视这些瓶颈的实用程序。最后,本文列出了一些有价值的 IBM 资源,以帮助您发现有价值的 DB2 信息。
本文是为那些在 DB2 数据库管理方面有中级技能的人而写的。
读前须知
在开始性能调优过程之前,应确保您已经应用了最新的 DB2 修订包(fix pack)。修订包常常会带来性能的提高。我们要使用 DB2 FixPak 4 作为本文的基础。如果您使用的是 FP4 之前的版本,那么这种环境可能不能提供这里讨论的所有选项。
在进行调优时,最好是有一个关于数据库使用(即应用程序运行在 DB2 上的工作负载)的可再现场景,这样就可以利用这种可再现场景来量身定制调优效果。例如,如果工作负载在不同的运行期间所经历的时间上有 10% 的变化量,那么就很难知道调优的真正效果如何。此外,如果在两次运行中各自的工作负载不一样,也就难于衡量数据库管理器和数据库配置参数所发生的变化。
坚持跟踪所有的变化。这样有助于开发调优脚本或者建议,以作为供其他 DBA 参考的历史,同时也有助于防止遵循不良的变化。
“十大”性能增强推动器
做了下面十件事情,您就几乎可以使数据库获得最佳性能。通常您会发现,通过大约 10% 的配置变化,就可以达到最佳性能的 90%。我将在下面适当的小节(在圆括号中标出)中详细讨论其中的每一条:
确保有足够的磁盘(每个 CPU 有 6-10 个磁盘才是一个好的开端)。每个表空间的容器应该跨越所有可用的磁盘。有些表空间,例如 SYSCATSPACE 以及那些表数量不多的表空间,不需要展开到所有磁盘上,而那些具有大型用户或临时表的表空间则应该跨越所有磁盘。( 表空间)。
缓冲池应该占用可用内存的大约 75% (OLTP) 或 50% (OLAP)( 缓冲池)。
应该对所有表执行 runstats,包括系统编目表( Runstats)。
使用 Design Advisor 为 SQL 工作负载推荐索引和检查索引( Design Advisor)。
使用 Configuration Advisor 为应用程序环境配置数据库管理器和数据库( Configuration Advisor)。
日志记录应该在一个独立的高速驱动器上进行,该驱动器由 NEWLOGPATH 数据库配置参数指定( Experimenting)。
通过频繁的提交可以增加并发性( SQL 语句调优)。
应该增加 SORTHEAP,以避免排序溢出( DBM 和 DB 配置)。
对于系统编目表空间和临时表空间,表空间类型应该为 SMS,而对于其他表空间,表空间类型应为 DMS( raw device 或者是文件)。运行 db2empfa,以便支持用于 SMS 表空间的多页(multi-page )文件的空间分配。这将允许 SMS 表空间一次增长一个区段(Extend),而不是一页,从而可以加快那些大型的插入操作和溢出磁盘的排序操作( 表空间)。
对于重复的语句,使用参数标记 ( SQL 语句调优)。
创建数据库
创建一个数据库时,系统会缺省地创建 3 个系统管理存储(System Managed Storage,SMS) 表空间(SYSCATSPACE、TEMPSPACE1 和 USERSPACE),以及一个 4 MB 的缓冲池(IBMDEFAULTBP),这些表空间和缓冲池的页面大小都是 4 KB 。根据下面的建议,先删除 TEMPSPACE1 和 USERSPACE 然后再重新创建它们,通常这是一种可取的做法。几乎在所有情况下, SYSCATSPACE 都不需要再作进一步的优化,但是如果将其容器展开到几个磁盘上,性能上可能会有少量提升。( 稍后讨论)。
在创建数据库时,您可以利用自动配置选项来根据环境对数据库进行最初的配置。当应用程序以编程方式创建 DB2 数据库时,这样做很方便,因为可以将这些选项从应用程序提供给 DB2。在自动配置数据库时不得不用到的另一个选项是更强大的 Configuration Advisor GUI,它不但可以配置数据库,而且还可以配置实例。不过,要使用 Configuration Advisor,数据库必须首先存在。我们将在 随后的小节中讨论 Configuration Advisor。
在 清单 1中,我们使用 CREATE DATABASE 命令的自动配置选项在 Windows 中创建了一个数据库,该数据库有一个跨越两个可用磁盘的 SYSCATSPACE。
清单 1. 使用自动配置选项创建数据库
create database prod1 catalog tablespace
managed by system using ('c:proddbcattbs1','d:proddbcattbs2')
extentsize 16 prefetchsize 32
autocon图 using mem_percent 50 workload_type simple num_stmts 10
tpm 20 admin_priority performance num_local_apps 2 num_remote_apps
200 isolation CS bp_resizeable yes apply db and dbm
表 1显示了有效的自动配置输入关键字以及值:
表 1. 自动配置选项
关键字 | 有效值 | 缺省值 | 描述 |
mem_percent | 1-100 | 25 | 分配给数据库的物理存储空间的百分比。如果本服务器(不包括操作系统)上运行有其他应用程序,那么将其设为小于 100 的某个值 |
workload_type | simple, mixed, complex | mixed | simple 型工作负载倾向于 I/O 密集型,并且大多数是事务处理(OLTP),而 complex 型工作负载则倾向于 CPU 密集型,并且大多数是查询(OLAP/DSS) |
num_stmts | 1-1000000 | 25 | 每个工作单元包含的语句条数 |
tpm | 1-200000 | 60 | 每分钟的事务数。 |
admin_priority | performance, recovery, both | both | 优化以获得更好性能(每分钟更多的事务数)或更好的回复时间 |
num_local_apps | 0-5000 | 0 | 连接的本地应用程序的数目 |
num_remote_apps | 0-5000 | 100 | 连接的远程应用程序的数目 |
isolation | RR, RS, CS, UR | RR | 连接到该数据库的应用程序的隔离级别(Repeatable Read、Read Stability、Cursor Stability 和 Uncommitted Read)。 |
bp_resizeable | yes, no | yes | 是否可以在线更改缓冲池大小 |
Configuration Advisor
如果您在创建数据库的时候已经使用了自动配置,那么这一步就不是很重要了。Configuration Advisor 是一个 GUI 工具,它允许根据您针对一系列问题给出的回答自动配置数据库和实例。通过使用这种工具,常常可以取得相当可观的性能提升。这个工具可以从 Control Center 中通过右键单击数据库并选择 "Configuration Advisor" 来打开。当您回答完所有问题后,就可以生成结果,还可以选择应用结果。 图 1展示了结果页面的屏幕快照:
图 1. Configuration Advisor Results 屏幕
创建缓冲池
恰当地定义缓冲池是拥有一个运行良好的系统的关键之一。对于 32 位操作系统,知道共享存储器的界限十分重要,因为这种界限将限制数据库的缓冲池(即数据库的全局存储器),使其不能超出以下界限(64 位系统没有这样的界限):
AIX - 1.75 GB
Linux - 1.75 GB
Sun - 3.35 GB
HP-UX - approximately 800 MB
Windows - 2-3 GB (在 NT/2000 上的 boot.ini 中使用的是 ' 3GB' switch)
用下面的公式计算近似的数据库全局存储器的使用:
清单 2. 计算全局存储器的使用(共享存储器)
buffer pools + dbheap + util_heap_sz + pkgcachesz + aslheapsz + locklist + approx 10% overhead
如果启用了 INTRA_PARALLEL,那么将 sheapthres_shr 的值加到总和中。
确定有多少缓冲池
对于数据库中一个表空