基本信息作者:牛新庄
出版社:清华大学出版社
出版日期:2009年
ISBN:9787302199533
装帧:平装
开本:16
定价:68.00
内容简介《DB2数据库性能调整和优化》侧重于介绍DB2数据库的性能调优。性能调优是一个系统工程:全面监控分析操作系统、I/O性能、内存、应用及数据库才能快速找到问题根源;深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能有针对性地快速提出解决问题的方法;快照、db2pd、db2expln及事件监控器等则是必须熟练掌握的工具。这本书正是覆盖了性能调优所需要的全部领域,并提供了大量的性能调优的实际案例。
本书系统性地总结了DB2数据库性能调整的方法、流程、思路和保持系统良好性能的注意要点。最难得的是作者分享了10年积累的DB2性能调优案例和经验总结。
编辑推荐《DB2数据库性能调整和优化》特色:
从全局的角度(操作系统、存储、数据库设计和应用SQL)来讲解如何调优。
本书将基本概念、深入研究、性能监控、调整案例等相关内容,按照每章一条主线展开,从而使读者通过每章的阅读,能够对相关知识有一个纵向的深入认知。
本书性能问题基本上涵盖了实际工作中90%的性能问题,具有重大参考价值。
本书是作者10年积累的DB2性能调优案例和经验的总结。
目录第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书籍从选题、审稿到出版无不得到他的热心帮助,在此致以深深的谢意!感谢我的好兄弟骆洪青和袁春光,他们审核了书中的大部分章节。同时也感谢中信银行的胡瑞娟、苏兰芳和我的师弟林春,他们审核了部分章节并从用户的角度给我提出了很多宝贵的建议!最后,谨以此书献给我心爱的妻子,遇到她是我人生最大的成就!
新庄
于2009年新年
序二
2003年与新庄初次相识即给我留下了深刻印象,为人真诚、勤奋、踏实、富有热情,有着雄厚的数据库理论知识和高超的数据库技术,曾为大量的金融机构及大型企业作过数据库理论及操作培训。他的授课深入浅出,将枯燥的理论知识讲得通俗易懂,赢得了所有培训人员和企业的高度肯定,为DB2数据库知识在中国的普及作出了巨大贡献。在实务上,新庄更是帮助多家金融企业和机构解决了长期困扰的数据库性能问题。
和书店内满是Oracle数据库书籍不同的是,DB2数据库虽进入国内年数已久,但仅有几本IBM出版的介绍数据库基本操作的书籍,介绍性能调优、数据库内部机理机制等方面的书籍更是非常缺乏。本人在金融行业软件开发以及系统优化的10年时间里,深刻感受到DB2相关书籍稀少的困苦。偶与新庄谈起资料缺乏、高水平DB2书籍稀少的苦恼,均感慨DB2在金融行业使用如此广泛,大家在开发和运行优化时却仅靠口口相传,实在不符合DB2在国内金融行业的地位,也不利于这些核心系统的安全稳定运行。因而突然看到新庄写了这样一本深入浅出、讲解极为透彻且在实务上也极具操作性的书,不由得喜出望外。
本书侧重于介绍DB2数据库的性能调优,而性能调优是一个系统工程:全面监测分析操作系统、IO性能、网络传输、应用及数据库才能快速找到问题根源;深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能有针对性地快速提出解决问题的方法;快照、db2pd、db2expln及事件监控器等则是必须要熟练掌握的工具。这本书正是覆盖了性能调优所需要的全部领域,并提供了大量的性能调优的实际案例,为DB2开发、维护及系统优化人员都带来了福音,更为包括金融行业在内的众多核心系统的稳定运行及优化提供了指导利器。本书的推广和热卖,我极具信心!
海通证券股份有限公司信息技术部总经理助理
国内数据库顶尖高手
曾任国内某证券行业TOP5软件公司技术总监
曾主持开发期货交易所核心系统,并主持设计开发多家大型证券公司核心交易系统及风控等管理系统,在金融IT领域有着丰富的实践经验和专业背景知识,特别在大型数据库、大型系统架构设计等方面有着深厚的理论功底及实践经验。
王洪涛
2009年1月
序三(我与牛君初相识)
有些人,在你第一次见到时会蓦然想起四个字:相见恨晚。我和牛新庄就属于这样的朋友。这一次他完成了《DB2数据库性能调整和优化》一书,嘱我写点文字,我欣然允诺,虽然在DB2方面我是没有什么发言权的。
关于小牛
我和小牛相识于2006年,在“中国首届杰出数据库工程师”评选活动中,我们入围了前十,同时获得了“杰出数据库工程师”的称号。在最终评审的现场答辩之后,我们畅谈良久,探讨个人爱好、答辩主题、数据库技术,甚至职业发展等等。在众多问题上的一致还并不是最重要的,最重要的是我们发现彼此的技术经历、个人性格等等竟然具有极大的相似性。在这样的机缘巧合之下,我们成了朋友。
第一次见到小牛时,他穿白色衬衫,肩背黑色电脑包,一副行色匆匆、独闯天涯的形象,以至于多年之后,我记忆里的他还是依然如初。
谈到在面对技术的学习、钻研、思考、提高,以及不断向上的成长,我们都经历了孜孜不倦的探索过程。小牛是在不断的学习、积累以及实践中成长起来的。在很长一段时间内,他不断奔波于国内的各个城市,他不计较出差、也不计较报酬,在他看来能够不断通过实践让自己成长是第一要义。同样,在这很长一段时间内,除了工作学习之外,其他一切都不在他的考虑范围之内。
就这样经历了在别人看来是痴迷、苦修一样的生活之后,终于成就了今日的一代大家。
在现在的很多年轻人身上,我以为恰恰缺少的就是这样的忘我与痴迷。在我熟悉的Oracle技术领域,很多年轻人越来越早地将注意力集中在薪水和职位上,开始变得浮躁,而我想说的是,往往是那些将诸如高薪与职位忘怀的人反而能更快地抵达。“不经一番寒彻骨,安得梅花扑鼻香”,这样的道理人人都懂,可是能够真正实施的人并不多。
所以,结合我们的经验与感悟,有16个字送给进入这一领域的读者:去除浮躁,认真学习,不断积累,寻找机遇。
关于本书
在技术上,小牛几乎是无可挑剔的。他涉猎极广,在数据库方面,对DB2、Oracle都具有精深的造诣,也正因为广博的知识与丰富的经验,他才能够敏锐地洞察不同数据库的尺之所短、寸之所长。在和他关于技术的讨论中,经常让我受益匪浅。
市场上关于DB2的书籍本就不多,结合实践的经验总结就更是鲜见,小牛这本书无疑会给致力于学习与管理DB2数据库的技术人员们带来福音。
性能优化从来都不是单纯的事情,要想提高数据库的性能,必须综合考虑数据库、操作系统、存储甚至应用架构的设计,小牛将这些技术内容全面地涵盖在了本书之中,并且通过最后整整一章的内容来讲解实际案例的诊断过程,理论与实践相结合是最好的学习方法,这本书就是这样将精彩的内容呈现给我们的。
关于勤奋
在技术道路上,我们一致认为能够与大家分享的最重要的两个字就是——勤奋。也正是这两个字,才使我们成为惺惺相惜的好友。
我曾经在《循序渐进Oracle》一书的后记中写过一段关于勤奋的文字,转录在这里,因为这种勤奋的态度是我和小牛共同信奉的信条。
对于我个人,压力随时都在肩上。而勤奋是我们最锋利的武器。
2005年,偶然读到王小慧的作品——《我的视觉日记》,感觉极为震撼。那本书我认认真真地读过很多次,书的内容中,至今记忆犹新的是书尾列出的作者作品年表。除了众多的摄影、电影拍摄与展览活动外,作者几乎保持了每年2、3本的作品出版速度,这需要多么大的勤奋付出以及坚持不懈啊!
有一位记者曾经这样写道:在她面前你会觉得惭愧,觉得自己至多是个中等水平的人,而且无可救药的懒惰。
这段话让我经常想起小牛,他比我年轻(所以我称他小牛),但是其成就却常让我汗颜,他做学问至博士,做技术涉猎与范围又远较我广泛。所以我经常以小牛为鉴,警示自己不可懈怠。有一位可以为鉴的朋友,实为人生之幸运。
而关于勤奋,更让人敬佩的是另外一位大师——李敖,据说他曾经每月写作一本书,连续写了十年。
这些天才横溢的作家尚且如此至为勤奋,而我们,唯有更为努力。
所以,最后,虽然是在与文学完全不同的这条技术道路上,我仍然只有两个字作为最后的分享——勤奋。
独立咨询顾问,Oracle ACE 总监,《深入浅出Oracle》、《循序渐进Oracle》作者
盖国强(eygle)
2009年1月
序四
与牛新庄的接触源于10年前在大学里一起做项目,那时“恰同学少年”,虽无伟人们指点江山之意气风发,却也会因一个技术难题的攻克而一道去学校排档里大快朵颐。牛新庄对技术追求之不懈在学校中就已经展现出那种“为伊消得人憔悴,衣带渐宽终不悔”的境界。在21世纪初的狂热的互联网大潮中,牛新庄从纷繁复杂的IT技术中选择了数据库作为自己的主攻方向并且一直持续至今,是为一纲举而百目张,终于成为国内数据库顶尖级高手。
牛新庄涉猎极广,他从数据库出发,向下延伸至操作系统、存储,向上延伸至中间件,几乎所有企业应用涉及的平台他都有广泛而深入的研究,如AIX、HP-UX、IBM存储、EMC存储、Oracle、DB2、Informix、WebSphere、CICS、MQ等。这些知识的融会贯通使得牛新庄在解决客户碰到的各种实际问题时,如庖丁解牛般游刃有余。牛新庄在各种实践的基础上不断总结,能够从更高的视角反思DBA遇到的各种问题,并且上升到方法论,始有这套书的雏形。
DB2的学习资料在其信息文档和网络中有很多,但知识点分散,多不成体系,更是缺乏专家实践应用经验总结。这套书凝聚了牛新庄大量的心血,是其10年DB2应用经验的总结。这套书特点是注重实用,内容由浅及深,涵盖DB2的管理、运行维护、应用开发、内核及架构的剖析,以及性能调整和优化。书中还有大量的提示点,虽只有寥寥数语,确是作者多年反复成功亦或失败的DB2实践体会,值得读者反复回味。
如果性能问题一直困扰着您,您也不要期望有一颗灵丹妙药,只需一试即能解决所有问题。性能优化的问题,是对DBA综合能力的一个考验,需要DBA亲身实践去寻找答案。但是在寻找答案的过程中您必须有一个正确、完整而且有组织的指引,否则这个答案您将永远找不到。有人说看书是按图索骥,其实按图索骥又有何妨,至少您心里会有底,知道自己离目标的距离是远是近。读者如果能从本书这个“图”索到性能瓶颈这个“骥”,也就达到了作者授业、解惑之目标了。
北京银信长远软件技术有限公司 总经理
数据库高级专家
IBM官方资深培训讲师
骆洪青
2009年3月
文摘存储I/O设计
对于任何程序的运行来说,最慢、最花费时间的操作实际上是从磁盘中检索数据。这主要缘于磁盘 I/O 访问中存在的物理机械过程(磁头旋转和寻道)。尽管磁盘存储技术在最近几年取得了极大的进步,但磁盘的旋转速度却没有太大的提高。您必须清楚这样一个事实:在一定条件下,RAM 访问仅需要大概 540个 CPU时钟周期,而磁盘访问则需要花费大概20 000 000个CPU 时钟周期。很明显,系统中访问数据最薄弱的环节就是磁盘 I/O 存储系统,从性能调整的角度来说,就是确保磁盘数据布局不会成为更严重的瓶颈。糟糕的数据布局将会给 I/O 性能带来更大的影响。在对系统进行任何优化活动之前,首先应该了解您的存储 I/O 系统的物理体系结构,因为如果您所设计的存储 I/O 系统非常糟糕,并且其中包含慢速磁盘,或者适配器的使用非常低效,那么其他的任何优化工作都无法提供帮助。
数据库的作用就是实现对数据的管理和查询。任何一个数据库系统,必然存在对数据的大量读、写操作。所以I/O问题也往往是导致数据库性能问题的重要原因。要控制好数据库的整体I/O性能,在规划数据库架构时就需要做好存储I/O系统的设计和配置。例如,将对I/O要求不同的文件放置在不同的存储设备上;规划表空间容器的分布、均衡I/O负担、使用并行I/O访问等。在一个应用系统的逻辑部署和物理部署图中,存储和操作系统位于应用系统体系结构的最底层。而数据库是部署在操作系统和存储层之上的,所以我们在做数据库的物理设计和逻辑设计之前,必须先做好存储I/O设计。存储I/O设计中最大的一个原则就是将I/O访问的分布最大限度地平衡在所有可以利用的物理设备上。
本章主要内容包括:
存储基本概念
存储架构
存储相关性能调整案例
存储设计性能相关问题
存储I/O设计总结
2.1 存储基本概念
关于存储的概念太多,许多已经超出了本书的讨论范围。本章主要讲解最常见的几个概念,它们是我们进行存储I/O设计所必须掌握的。
2.1.1 硬盘
硬盘处于整个存储系统的最底层,核心的业务数据通常都存放在硬盘上。我们从硬盘上读取一次I/O要花费的时间如下:
硬盘上一次I/O时间=磁盘寻道时间+磁头旋转到特定扇区时间+传输时间+延迟
图2-1所示的硬盘I/O传输图中标识了磁头在不同位置的寻道时间。衡量一个磁盘的I/O能力有如下几个指标:
图2-1 磁盘I/O传输图
● 硬盘的转速(Rotational Speed):也就是硬盘电机主轴的转速,转
……