标题：DB2数据库性能的调整和优化
基本信息
· 作者：牛新庄   
· 出版社：清华大学出版社
· ISBN：9787302199533
· 出版日期：2009 年5月
· 开本：16开
· 页码：499
· 版次：1-1
  
内容简介
这本书正是覆盖了性能调优所需要的全部领域，并提供了大量的性能调优的实际案例。.
最难得的是作者分享了10年积累的DB2性能调优案例和经验总结
编辑推荐
从全局的角度(操作系统、存储、数据库设计和应用SQL)来讲解如何调优。.
本书将基本概念、深入研究、性能监控、调整案例等相关内容，按照每章一条主线展开，从而使读者通过每章的阅读，能够对相关知识有一个纵向的深入认知。..
本书性能问题基本上涵盖了实际工作中90%的性能问题，具有重大参考价值。
目录
第1章 性能调整概述. 1
1.1 性能概述 2
1.2 性能评估 4
1.3 建立性能目标 7
1.4 什么时候需要做性能调整 8
1.5 性能调整准则 9
1.6 性能调整的方法和过程 10
1.6.1 性能调整的步骤 10
1.6.2 性能调整的限制 11
1.6.3 向客户了解情况 11
1.6.4 性能调整流程图 12
1.7 性能调整总结 15
第2章 存储I/O设计 19
2.1 存储基本概念 20
2.1.1 硬盘 20
2.1.2 磁盘阵列技术 21
2.1.3 存储的Cache 22
2.1.4 IOPS 22
2.1.5 网络存储技术 23
2.2 存储架构 24
.2.2.1 存储I/O处理过程 24
2.2.2 应用系统I/O流动图 24
2.2.3 RAID IOPS 26
2.2.4 RAID 10和RAID 5的比较 28
2.3 存储相关性能调整案例 31
2.4 存储I/O设计总结 32
第3章 操作系统相关性能问题 35
3.1 HP-UX系统性能监控综述 35
3.1.1 监控资源对象和标准 35
3.1.2 监控工具 36
3.1.3 监控系统总体运行状态 36
3.1.4 性能状态的判定流程和监控命令 38
3.2 AIX性能监控综述 47
3.2.1 监控工具 47
3.2.2 监控系统总体运行状态 48
3.2.3 监控CPU性能 51
3.2.4 监控内存使用 55
3.2.5 监控存储系统状态 57
3.2.6 监控网络状态 58
3.3 操作系统性能优化 60
3.3.1 直接I/O和并发I/O 61
3.3.2 异步I/O和同步I/O 62
3.3.3 minpout和maxpout 65
3.3.4 文件系统和裸设备 65
3.3.5 负载均衡及条带化(Striping) 66
3.4 逻辑卷和lvmo优化 72
3.4.1 使用lvmo进行优化 73
3.4.2 卷组 pbuf 池 73
3.4.3 pbuf设置不合理导致性能问题调整案例 74
3.4.4 使用 ioo 进行优化 78
3.5 总结 83
第4章 数据库物理设计和逻辑设计 85
4.1 数据库物理设计 85
4.1.1 表空间容器放置原则 85
4.1.2 数据库物理设计原则 86
4.2 数据库逻辑设计 86
4.2.1 缓冲池设计原则 86
4.2.2 表空间设计原则 91
4.3 使用Autoconfig设计数据库 99
4.4 其他高级设计技术 102
4.4.1 表分区及应用案例 102
4.4.2 数据库分区及应用案例 104
4.4.3 多维群集(MDC)及应用案例 106
4.4.4 物化查询表及应用案例 110
4.4.5 MDC、数据库分区、MQT和表分区配合使用 114
4.4.6 表压缩及应用案例 125
4.4.7 表压缩应用案例二 132
4.4.8 XML及应用案例 140
4.5 数据库设计总结 142
4.5.1 表空间与表设计方面的考虑 142
4.5.2 索引设计方面的考虑 146
4.5.3 缓冲池方面的考虑 147
4.5.4 总结 148
第5章 DB2性能监控 149
5.1 快照监视器案例 149
5.1.1 监控动态SQL语句 149
5.1.2 监控临时表空间使用 152
5.2 事件监视器及监控案例 153
5.3 利用表函数监控 158
5.4 性能管理视图及案例 163
5.4.1 监控缓冲池命中率 165
5.4.2 监控Package Cache大小 165
5.4.3 监控执行成本最高的SQL语句 166
5.4.4 监控运行最长的SQL语句 166
5.4.5 监控SQL准备和预编译时间最长的SQL语句 167
5.4.6 监控执行次数最多的SQL语句 167
5.4.7 监控排序次数最多的SQL语句 168
5.4.8 监控LOCK WAIT等待时间 168
5.4.9 监控LOCK CHAIN 169
5.4.10 监控锁内存使用 170
5.4.11 监控锁升级、死锁和锁超时 170
5.4.12 监控全表扫描的SQL 171
5.4.13 检查page cleaners是否足够 171
5.4.14 监控prefecher是否足够 172
5.4.15 监控数据库内存使用 173
5.4.16 监控日志使用情况 173
5.4.17 监控占用日志空间最旧的交易 174
5.4.18 用SQL监控健康指示器 174
5.4.19 监控存储路径 175
5.4.20 追踪监控历史 176
5.5 db2pd 176
5.5.1 常用db2pd监控选项和示例 177
5.5.2 使用db2pd监控死锁案例 191
5.5.3 db2pd使用问题总结 196
5.6 db2mtrk及监控案例 197
5.7 本章小结 200
第6章 数据库配置参数调整 201
6.1 数据库配置参数 201
6.2 监控和调优实例(DBM)配置参数 203
6.2.1 代理程序相关配置参数 203
6.2.2 SHEAPTHRES 206
6.2.3 FCM_NUM_BUFFERS 206
6.2.4 SHEAPTHRES_SHR 207
6.2.5 INTRA_PARALLEL 208
6.2.6 MON_HEAP_SZ 208
6.2.7 QUERY_HEAP_SZ 208
6.3 监控和调优DB配置参数 208
6.3.1 缓冲池大小 209
6.3.2 日志缓冲区大小(LOGBUFSZ) 215
6.3.3 应用程序堆大小(APPHEAPSZ) 216
6.3.4 SORTHEAP和SHEAPTHRES 217
6.3.5 锁相关配置参数 219
6.3.6 活动应用程序的最大数目(MAXAPPLS) 223
6.3.7 PKGCACHESZ 224
6.3.8 CATALOGCACHE_SZ 224
6.3.9 异步页清除程序的数目(NUM_IOCLEANERS) 224
6.3.10 异步I/O 服务器的数目(NUM_IOSERVERS).. 226
6.3.11 组提交数目(MINCOMMIT) 226
6.3.12 AVG_APPLS 228
6.3.13 CHNGPGS_THRESH(DB) 228
6.3.14 MAXFILOP 229
6.3.15 LOGPRIMARY、LOGSECOND和LOGFILSZ 229
6.3.16 STMTHEAP 229
6.3.17 DFT_QUERYOPT 229
6.3.18 UTIL_HEAP_SZ (DB) 230
6.4 调整DB2概要注册变量 230
6.4.1 DB2_PARALLEL_IO 230
6.4.2 DB2_EVALUNCOMMITTED 232
6.4.3 DB2_SKIPDELETED 232
6.4.4 DB2_SKIPINSERTED 232
6.4.5 DB2_USE_PAGE_CONTAINER_TAG 233
6.4.6 DB2_SELECTIVITY 233
6.5 内存自动调优 233
6.5.1 内存自动调优示例 234
6.5.2 启用内存自动调优及相关参数 235
6.6 总结 237
第7章 锁和并发 239
7.1 锁等待及调整案例 239
7.1.1 锁等待问题解决流程和步骤 240
7.1.2 捕获引起锁等待的SQL 242
7.1.3 利用db2pd捕获锁超时 244
7.2 锁升级及调整案例 248
7.2.1 监控锁升级 249
7.2.2 锁升级调整 250
7.3 死锁及调整案例 252
7.3.1 利用事件监视器监控死锁 253
7.3.2 死锁案例 255
7.3.3 最小化死锁建议 257
7.4 隔离级别与锁 257
7.4.1 可重复读(RR—Repeatable Read) 258
7.4.2 读稳定性(RS—Read Stability) 259
7.4.3 游标稳定性(CS—Cursor Stability) 261
7.4.4 未提交读(UR—Uncommitted Read) 263
7.4.5 隔离级别加锁总结 265
7.4.6 隔离级别总结 269
7.5 最大化并发性 271
7.5.1 选择合适的隔离级别 271
7.5.2 尽量避免锁等待、锁升级和死锁 271
7.5.3 设置合理的注册变量 271
7.6 锁相关的性能问题总结 280
7.7 锁与应用程序开发 282
7.8 本章小结 285
第8章 索引设计与优化 287
8.1 索引概念 287
8.1.1 索引优点 287
8.1.2 索引类型 289
8.2 索引结构 290
8.3 理解索引访问机制 293
8.4 索引设计 296
8.4.1 创建索引 296
8.4.2 创建集群索引 297
8.4.3 创建双向索引 297
8.4.4 完全索引访问(index access only) 299
8.4.5 与创建索引相关的问题 299
8.4.6 创建索引示例 300
8.5 索引创建原则与示例 301
8.5.1 索引与谓词 301
8.5.2 根据查询所使用的列建立索引 303
8.5.3 根据条件语句中谓词的选择度创建索引 304
8.5.4 避免在建有索引的列上使用函数 305
8.5.5 在那些需要被排序的列上创建索引 306
8.5.6 合理使用INCLUDE关键词创建索引 307
8.5.7 指定索引的排序属性 308
8.6 影响索引性能的相关配置 309
8.6.1 设置影响索引性能的配置参数 309
8.6.2 为索引指定不同的表空间 309
8.6.3 确保索引的集群度 310
8.6.4 使表和索引统计信息保持最新 310
8.6.5 重组索引 311
8.7 索引维护 311
8.7.1 异步索引清除(AIC) 312
8.7.2 联机索引整理碎片 314
8.8 DB2 Design Advisor(db2advis) 315
8.9 索引调整总结 319
8.9.1 索引设计总结 319
8.9.2 索引性能总结 321
第9章 DB2优化器 325
9.1 DB2优化器介绍 326
9.2 SQL语句执行过程 328
9.3 优化器组件和工作原理 331
9.3.1 查询重写方法和示例：谓词移动、合并和转换 331
9.3.2 查询重写示例：视图合并 332
9.3.3 查询器重写示例：消除DISTINCT 335
9.3.4 查询器重写示例：隐含谓词 336
9.4 扫描方式 337
9.4.1 全表扫描 337
9.4.2 索引扫描 338
9.5 连接方法 341
9.5.1 嵌套循环连接 343
9.5.2 合并连接 344
9.5.3 哈希(hash)连接 345
9.5.4 选择最佳连接的策略 346
9.6 优化级别 347
9.7 如何影响优化器来提高性能 348
9.7.1 使DB2统计信息保持最新 348
9.7.2 构建适当的索引 349
9.7.3 配置合理的数据库配置参数 350
9.7.4 选择合适的优化级别 351
9.7.5 合理的存储I/O设计 351
9.7.6 良好的应用程序设计和编码 352
9.8 优化器总结 352
第10章 统计信息更新与碎片整理 353
10.1 统计信息更新 353
10.1.1 统计信息的重要性 353
10.1.2 统计信息更新示例 357
10.1.3 LIKE STATISTICS统计信息更新 360
10.1.4 列组统计信息更新 361
10.1.5 分布统计信息更新 371
10.1.6 统计信息更新策略 377
10.2 碎片整理 379
10.2.1 碎片产生机制和影响 379
10.2.2 确定何时重组表和索引 380
10.2.3 执行表、索引检查是否需要做REORG 383
10.3 重新绑定程序包 385
10.4 本章小结 386
第11章 SQL语句调优 389
11.1 通过监控找出最消耗资源的SQL语句 389
11.2 通过解释工具分析SQL语句执行计划 390
11.2.1 解释表 391
11.2.2 Visual Explain(可视化解释) 392
11.2.3 db2expln 400
11.2.4 db2exfmt 403
11.2.5 各种解释工具比较 405
11.2.6 如何从解释信息中获取有价值的建议 406
11.3 理解SQL语句如何工作 406
11.3.1 理解谓词类型 406
11.3.2 排序和分组 410
11.3.3 连接方法 412
11.3.4 扫描方式 413
11.4 SQL调优案例 413
11.4.1 用一条语句即可做到时避免使用多条语句 413
11.4.2 合理使用NOT IN和NOT EXISTS 414
11.4.3 合理使用子查询减少数据扫描和利用索引 417
11.4.4 调整表的连接顺序，减小中间结果集的数据量 418
11.4.5 在有偏差数据的情况下使用参数标记时，指定选择性 420
11.4.6 SQL使用UDF代替查询中复杂的部分 420
11.4.7 从多个SQL语句到一个 SQL表达式 422
11.4.8 使用SQL一次处理一个集合语义 423
11.4.9 在无副作用的情况下，请使用SQL 函数 425
11.4.10 小结 426
11.5 提高应用程序性能 426
11.5.1 良好的SQL编码规则 426
11.5.2 提高SQL编程性能 428
11.5.3 改进游标性能 430
11.5.4 根据业务逻辑选择最低粒度的隔离级别 431
11.5.5 通过REOPT绑定选项来提高性能 431
11.5.6 统计信息、碎片整理和重新绑定 432
11.5.7 避免不必要的排序 433
11.5.8 在C/S环境中利用SQL存储过程降低网络开销 433
11.5.9 高并发环境下使用连接池 433
11.5.10 使用Design Advisor(db2advis)建议索引 434
11.5.11 提高批量删除、插入和更新速度 434
第12章 DB2调优案例、问题总结和技巧 437
12.1 调优案例一：某移动公司存储设计不当和SQL引起的I/O瓶颈 437
12.2 调优案例二：某银行知识库系统锁等待、锁升级引起性能瓶颈 444
12.3 调优案例三：某汽车制造商ERP系统通过调整统计信息提高性能 453
12.4 调优案例四：某农信社批量代收电费批处理慢调优案例 464
12.5 调优学习案例：利用压力测试程序学习DB2调优 468
后 记 501
参考文献... 503
前言
在介绍本书前，我先讲讲我的数据库学习之路。我在1999年刚刚开始念硕士时就给自己确定了以后的发展方向，当时定了两个：网络和数据库技术。因为2000年时，网络特别红火，拥有CCNP、CCIE认证的特别牛。所以自己也考了CCNP证书，但是到后来我发现网络有很多是硬件层面的东西，对厂商的依赖特别强，而且面特别窄。所以慢慢地就把这个方向放弃了，而我喜欢钻研，就选择了数据库技术。在确认好数据库这个方向后，我深入地学习了数据库理论方面的知识，我记得中国人民大学王珊教授那本《数据库系统原理教程》一书我读了几十遍。在对数据库理论学习的同时，我也开始对DB2和Oracle进行深入学习。.
我是从1999年开始使用DB2 V5.2的，那时因为我导师做一个课题需要用到DB2数据库。那时市场上关于DB2方面的技术书籍几乎没有，互联网还不像现在这么发达，自己只能依靠查看DB2随机文档来学习。那时，我利用自己兼职帮别人做一些小软件和课题的费用去考OCP认证和DB2认证。其实我认为考认证是一个很好的外界动力来促使自己学习，因为考试需要花费很大一笔费用，如果不想浪费钱就只能拼命地看书。这是一个很大的促使自己看书的外界动力。那时读研究生有的是时间，所以在2000年我就把OCP 8i的认证通过了，后来又陆续通过了DB2 V5.2的认证。这些认证通过后能很大地增强自己的自信。当时我同时帮导师做应用程序开发工作，那时用PB、Delphi等编程工具。在开发中我有意识地增强自己对SQL的学习，这对我后来的性能调优非常有帮助。因为我很多时候在客户现场看到同样一个操作，本来在数据库中利用函数或者其他高级SQL可以实现的，而开发人员却频繁地在数据库和应用程序之间进行切换，殊不知，在过程层(程序)和数据库层反复上下文切换交互会显著影响应用效率。我认为自己应该是国内写SQL水平比较高的人，呵呵。所以，首先要有一个清晰的方向和规划，然后有意识地去往这个方向努力。做好一个时期的人生规划非常重要，它是你努力的方向，因为积极的学习比被动的学习效率要高太多。
机遇偏爱于有准备的人。记得2001年初的时候我在网上看到一个帖子说要找一个人去安装DB2数据库，差旅报销，每天500元。那时我就喜出望外，因为需要有DB2认证才能去，而我那时DB2系统管理、应用开发的认证都有，所以很快就通过了。后来就去了客户现场，到了以后才发现不是安装，而是去给客户讲课，当时我就傻眼了，因为讲课需要的远比安装配置要难得多，而之前我没有讲过课。没办法了，只能前一天夜里看教材备课到凌晨5点，睡两个小时，8点半去讲课，就这样4天讲课，我每天都是休息3小时左右。还好自己毕竟使用过DB2，而且也过了DB2认证，还是有基础的。这次讲课虽然不太成功，但是毕竟通过了，勉强可以打60分吧，没想到这次培训竟是我以后几年培训生涯的开始。经过这次讲课后，我也看到了自己的差距，知道仅仅拥有认证是不行的，因为客户问的很多问题，书本上是没有的，说明自己还需要进一步努力，而且自己看书有些概念虽然不太懂也不会太深入研究，但是如果讲课你就自己必须把一些原理概念弄清楚，所以这需要对数据库有更深入的学习。
后来经过一些其他的渠道，IBM培训部知道我能讲DB2并且有相关证书，就找我讲DB2系列课程。所以从2001年开始，我就经常作为IBM官方讲师开始讲DB2系列所有课程。我感觉到讲课是个很好的学习过程，因为讲一些内容，你首先自己要搞清楚，这对提升自己有很大的帮助，我把课堂学员问的实际产生的问题自己深入地研究。我自己对培训有这样的认识，我是希望学员在这里听你讲3个小时要远远胜过自己看3个小时，而且如果把讲一堂课的内容比喻一杯水，那么老师至少应该储备一桶水，才能驾驭。所以，我在讲课准备过程中，精心准备实验，深入和学员交流。争取把一些概念能够用浅显易懂的例子来讲解，而要想做到这些，首先自己必须对这个概念有深刻的理解。所以这在客观上促进了自己的学习。
随着培训的增多，也有一些客户找我去做一些实际的调优工作。我记得第一次去客户现场调优是2001年去大连大通证券，当时主要解决锁等待问题。客户环境用到了AIX和CICS环境。当时虽然问题解决了，但自己心中还是感觉到比较虚，因为对AIX和CICS不了解，万一如果是这两个方面有问题，自己就没办法搞定了；同时认识到一个复杂系统的调整往往不是单方面的，需要具备全面的知识。经过这次事情后，我就在网上买了一个140的IBM工作站小机，自己安装AIX，开始学习AIX。这个期间我一边学习，一边把AIX的认证全部过掉。我记得非常清楚，为了做HA的实验着实费了很大的功夫，因为无法搞到7133阵列，那时小型机不像今天这么普及。后来自己又学习了CICS、WebSphere、MQ和存储，所以我认为有目的的学习，有压力和动力的学习效率是非常高的。就这样，在我培训的过程中，我发现自己哪个方面薄弱并且这个方向有前途，我就开始学习，不过那个时候我的技术主要以IBM为主。由于自己对培训比较用心以及客户的好评，开始找我做培训的国内培训机构开始变多，也感觉到这个期间自己的技术水平增长很快。
2002年11月，我参加首届“IBM DeveloperWorksLive! China 2002”大会，并获得IBM首次在国内评选的“杰出软件技术专家”奖，在6名获奖者中名列第2。获得这个认证后对我有很大的帮助，因为找我的人更多了，所以2002、2003年是我技术提升最快的两年，在这两年我又陆续学习了HP-UX、WebSphere和MQ并通过了认证。其实我有时感觉到如果你把一门技术研究得非常深非常透，这时你再去学习另一门技术，就非常轻松，因为技术是触类旁通的。我在学习完AIX再去学习HP-UX就感觉非常轻松。同时，在学习Oracle和DB2后再去学习Informix感觉到很容易。通过这种纵向的深入和横向的比较，就会思考它们的区别，就能够发现每一个产品的尺之所长、寸之所短，这样技术视野更加全局。在学习过程中，不断地把实践和理论结合，不断地补充理论来充实自己，知其然知其所以然。而且通过对一个产品的深入，往往能够发现这个产品的缺点和需要改进的地方。就拿DB2来说，它的每次版本更新的新特性我基本上在新版本没有出来之前就猜得差不多了。因为一是我是贴近真实用户的，了解他们的真实需求；二是自己一直在用，自己不断地总结思考；三是别的数据库有，而DB2没有，那么在下个版本就会增加。所以相对来说，对新版本的新特性学习就非常轻松了。..
就DB2而言，我是国内拥有DB2认证最多的人，我拥有DB2 V5.2 、V7.1、V8.1和V9的全部认证。我是国内第一个把DB2 V8认证全部通过的人，当然这也是巧合，因为2003年3月非典我被困在深圳，在网上看到DB2 V8认证从4月1日开始考，就在前一天报名注册，第二天把DB2 V8(新特性、高级DBA、应用开发、BI等所有认证)全部pass。
2004~2005年基本上是我最忙碌的两年。那个时候找我讲课的培训机构以及性能调优的客户非常多，一年我基本上天天在天上飞(当然学校导师那边我是有办法搞定的)，培训机构找我讲课常常需要提前一个月预约时间。那时除了过年在家几天，其他时间都是在做培训和诊断调优等，足迹踏遍国内主要城市。那时我基本上是国内六大行开发中心和数据中心培训的指定老师，只要时间不冲突，还为北京银信科技、山东农信、广东农信、交行大集中IBP等项目做数据库技术顾问。那时年轻很有精力，我记得有一次是2004年9月，我白天上午9点为上海移动IT部门做AIX动态逻辑分区(DLPAR)的培训；17点打车前往扬州，20点到达扬州供电局协助他们进行电力负荷控制系统项目上线，彻夜奋战到凌晨3点半；然后连夜打的赶往上海，凌晨6点到达酒店；休息两小时，8点出发，准时出现在上海移动培训现场。那时我对报酬不太在意，我想的是拼命积累技术和客户资源，不断对技术学习、钻研、思考、提高，以及不断向上成长和孜孜不倦的探索，我就是这样在不断的学习、积累以及实践中成长起来的。
在很长一段时间内，我不断奔波于国内的各个城市，不计较出差、报酬，在我看来能够不断通过实践让自己成长是第一要义。而且去的客户现场越多、处理的问题越多，就越发现自己的不足，然后就拼命地学习，不断地积累、总结和思考，这样就进入了一个良性循环。至今我仍然怀念那种充实、紧张和激情的黄金年代。2004年和2005年，我分别在上海、北京注册了公司。一方面因为以独立咨询顾问的个人身份无法出具发票；另一方面，随着项目越做越大，尤其是很多银行的数据库架构和维护项目涉及合同金额也越来越大，需要签订合同，以公司的身份来签合同更加合适。当然这些年并非所有都是一帆风顺，也犯过一些重大错误。例如，我曾经在2002年5月1日把某机场的数据库调死，导致机场航班信息管理系统瘫痪；早期也曾经把证券系统因为调整而宕机。这些都对客户造成了重大影响，同时也让我思考总结自己的不足。也许这是成长必须要走的路。所以，经过这两次事件之后，我之后的调优基本上没有犯过错误。
2006年8月我获得“2006年中国首届杰出数据库工程师”称号，也算是对我这么多年学习数据库的一个总结吧。2007年开始，我专注于做一些大客户的运维，相应就减少了培训的次数。2008年我被建设银行以217万年薪聘请为资深技术专家来维护Oracle和Informix数据库。做技术而言，以一己之力能挣到年薪百万这常常是我感到自豪的地方，也是让我感觉到技术的魅力和自己这么多年对技术钻研的认可。
致学友
其实我讲我的技术之路，主要给大家一些参考，尤其对在校学生，我希望我的学习之路大家能够模仿(毕竟大师级的路是很难模仿的)。而且，这么多年，能取得这么一点小成绩，勤奋、努力和坚持一直是我看重的。因为有了这些，不至于机遇惠顾你时，你怅然若失。
在现在的很多年轻人身上，我以为恰恰缺少的就是这样的忘我与痴迷。在我熟悉的数据库技术领域，很多年轻人越来越早地将注意力集中在薪水和职位上，开始变得浮躁，而我想说的是，往往是那些将诸如高薪与职位忘怀的人反而能更快地提升。不经一番寒彻骨，安得梅花扑鼻香。这样的道理人人都懂，可是能够真正实施的人并不多。
所以，结合我的学习经验与感悟，有16个字送给进入这一领域的读者：去除浮躁，认真学习，不断积累，寻找机遇。
这些年我做数据库，相对于Oracle数据库而言，我深深感到DB2技术书籍的匮乏，所以我一直想写一套DB2方面的技术书籍。坦白地说，写书是我挣钱性价比最低的一种方式，但是我一直感觉到自己有义务和责任去写一些东西来给大家分享，也算是对自己10年DB2学习经验的一个总结吧！但是过去一直没有时间，直到今年奥运保障期间，有了一些时间，我才写了这套书。在这套书中，我把应用开发和系统管理剥离开，分成两条线来讲解：《DB2应用开发实战指导》、《循序渐进DB2》、《深入解析DB2》，《DB2数据库性能调整与优化》。其实关于DB2方面的技术还有很多我没有涉及，例如高可用性、数据库分区、HDAR、高级安全等，但是限于篇幅和时间，我无法做到全方位的解析。
关于本书
本书侧重在数据库的性能调优。而性能调优是一个系统工程：全面监控分析操作系统、I/O性能、内存、应用及数据库才能快速找到问题根源；深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能有针对性地快速提出解决问题的方法；快照、db2pd、db2expln及事件监控器等等则是必须要熟练掌握的工具。本书正是覆盖了性能调优所需要的全部领域，并提供了大量的性能调优的实际案例。
本书系统性地总结了DB2数据库的性能调整的方法、流程、思路和保持系统良好性能的注意要点。最后，与读者分享了我10年积累的DB2性能调优案例和经验总结。本书所讲内容适用于DB2 V7、V8和V9.5的所有平台。
数据库学习之路
这里我对数据库学习做个总结：目前市场上虽然有Oracle、DB2、Informix、Sybase和SQL Server数据库，但是Informix数据库已经被IBM收购，而Sybase数据库在技术和市场上正走向没落。那么剩下的其实就是Oracle、DB2和SQL Server数据库。SQL Server数据库非常好，但是很遗憾的是只能在Windows平台使用，所以如果你深入研究SQL Server数据库我只能说你可以养家糊口，但挣大钱的概率小，因为用SQL Sever数据库的企业通常钱不多的，呵呵。而国内做Oracle数据库的人太多了，如果你想在Oracle领域出人头地，难度极大。反而DB2数据库做的人不太多，物以稀为贵。DB2数据库广泛应用在银行、电信、制造、零售、保险等行业，所以我强烈建议你学习DB2数据库，钻研IBM技术一般相对来说挣大钱的概率会大些。我们的时间精力是有限的，所以必须选择好方向然后努力为之。
序言
序一
这些年我负责中国DB2的售前技术团队, 认识牛新庄已经好多年了。印象很深的是2006年与他的几次交流，我们讨论了许多数据库的实用技术，以及用户在数据库管理和应用方面的主要挑战。他丰富的实战经验给我留下了极深的印象。那时他正在参加首届中国数据库工程师大赛，最终获得了最高的杰出数据库工程师大奖。 .
新庄是国内较早使用DB2的技术人员。他从1999年开始使用DB2 V5.2, 后来在工作中又学习了AIX、WebSphere、CICS和MQ等IBM技术，对Informix和Oracle等数据库也有非常深的理解。这些年他作为IBM培训部的认证讲师在国内讲解数据库技术，推动DB2在国内的传播。从2001年至今，新庄作为独立咨询顾问往返于国内大中城市，在金融六大行(工农中建交招)，农信，证券(国泰君安、海通、大通等)，电力(江苏电力公司、云南电力公司、山东电力公司等)，保险(中国人寿、信诚、平安等)，电信，邮政，移动(北京移动、上海移动、江苏移动、广东移动、天津移动、湖南移动、西藏移动、新疆移动、山东移动、吉林移动等)，青岛海尔，云南红塔，中远集团，宝钢等行业和国内中小企业之间做数据库设计、维护、问题诊断和性能调优。
深厚的产品知识和丰富的阅历和经验，使得新庄在对一些疑难问题的判断和处理上有独到的见解。他往往能够跳出固有的框架从一个广阔的视角来认识和分析, 并通过多年积累的方法论逐步排查，最终找到解决的方法。这一点在许多大型用户的案例中都得到了有效的印证，这些年我听到了很多大型用户对新庄技能的高度认可。
DB2的学习资料在其信息文档和网络中有很多，但是就性能调整而言，我认为本书将一系列相关的分散知识点真正形成了一个知识面。数据库的性能调整实际上涉及很多方面，不仅仅是数据库本身，而且需要考虑操作系统，存储规划，数据模型设计，应用设计，数据库产品的配置和监控等一系列相关的内容。
这本书不仅从产品的角度来介绍DB2，而且从实战的角度来剖析基于DB2设计和应用一个好的应用系统应该考虑哪些问题。本书系统性地总结了DB2数据库的性能调整的方法，内容覆盖了系统的整体设计规划，DB2与性能相关的内部核心技术和架构，关键的相关应用设计要点，以及稳定运行监控所应考虑的内容。最难得的是分享了作者多年积累的DB2性能调优案例，使读者有可能在实际的环境中去了解解决复杂问题的思路，将基本的理论和技术与实战进行结合。
这本书不仅是新庄10年DB2应用经验的总结，更是他10年对DB2数据库执着钻研的结晶。今天已有越来越多的用户在使用DB2，我相信这本书能对学习和使用DB2提供很大的帮助。希望它能成为您DB2旅程上的一个朋友，为您答疑解惑，点亮您前进的道路。
IBM中国区DB2信息管理技术经理
刘晶炜
2009年1月
序二
2003年与新庄初次相识即给我留下了深刻印象，为人真诚、勤奋、踏实、富有热情，有着雄厚的数据库理论知识和高超的数据库技术，曾为大量的金融机构及大型企业作过数据库理论及操作培训。他的授课深入浅出，将枯燥的理论知识讲得通俗易懂，赢得了所有培训人员和企业的高度肯定，为DB2数据库知识在中国的普及作出了巨大贡献。在实务上，新庄更是帮助多家金融企业和机构解决了长期困扰的数据库性能问题。
和书店内满是Oracle数据库书籍不同的是，DB2数据库虽进入国内年数已久，但仅有几本IBM出版的介绍数据库基本操作的书籍，介绍性能调优、数据库内部机理机制等方面的书籍更是非常缺乏。本人在金融行业软件开发以及系统优化的10年时间里，深刻感受到DB2相关书籍稀少的困苦。偶与新庄谈起资料缺乏、高水平DB2书籍稀少的苦恼，均感慨DB2在金融行业使用如此广泛，大家在开发和运行优化时却仅靠口口相传，实在不符合DB2在国内金融行业的地位，也不利于这些核心系统的安全稳定运行。因而突然看到新庄写了这样一本深入浅出、讲解极为透彻且在实务上也极具操作性的书，不由得喜出望外。
本书侧重于介绍DB2数据库的性能调优，而性能调优是一个系统工程：全面监测分析操作系统、IO性能、网络传输、应用及数据库才能快速找到问题根源；深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能有针对性地快速提出解决问题的方法；快照、db2pd、db2expln及事件监控器等则是必须要熟练掌握的工具。这本书正是覆盖了性能调优所需要的全部领域，并提供了大量的性能调优的实际案例，为DB2开发、维护及系统优化人员都带来了福音，更为包括金融行业在内的众多核心系统的稳定运行及优化提供了指导利器。本书的推广和热卖，我极具信心！
海通证券股份有限公司信息技术部总经理助理
国内数据库顶尖高手..
曾任国内某证券行业TOP5软件公司技术总监
曾主持开发期货交易所核心系统，并主持设计开发多家大型证券公司核心交易系统及风控等管理系统，在金融IT领域有着丰富的实践经验和专业背景知识，特别在大型数据库、大型系统架构设计等方面有着深厚的理论功底及实践经验。