标题：循序渐进DB2——DBA系统管理、运维与应用案例
图书简介
本书侧重于介绍DB2数据库的性能调优。性能调优是一个系统工程：全面监控分析操作系统、I/O性能、内存、应用及数据库才能快速找到问题根源；深刻理解DB2的锁及并发机制、索引原理、数据库参数、优化器原理、SQL语句调优等内部机理才能有针对性地快速提出解决问题的方法；快照、db2pd、db2expln及事件监控器等则是必须熟练掌握的工具。这本书正是覆盖了性能调优所需要的全部领域，并提供了大量的性能调优的实际案例。　　本书系统性地总结了DB2数据库性能调整的方法、流程、思路和保持系统良好性能的注意要点。最难得的是作者分享了10年积累的DB2性能调优案例和经验总结。
图书详细信息
作者：牛新庄 
ISBN：9787302201380
定价：80元
印次：1-3
装帧：平装
印刷日期：2010-9-2
前言
在介绍本书前，我先讲讲我的数据库学习之路。我在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年新年
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 存储的Cache22
2.1.4 IOPS22
2.1.5 网络存储技术23
2.2 存储架构24
2.2.1 存储I/O处理过程24
2.2.2 应用系统I/O流动图24
2.2.3 RAID IOPS26
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/O61
3.3.2 异步I/O和同步I/O62
3.3.3 minpout和maxpout65
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 CHAIN169
5.4.10 监控锁内存使用170
5.4.11 监控锁升级、死锁和锁超时170
5.4.12 监控全表扫描的SQL171
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 db2pd176
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 SHEAPTHRES206
6.2.3 FCM_NUM_BUFFERS206
6.2.4 SHEAPTHRES_SHR207
6.2.5 INTRA_PARALLEL208
6.2.6 MON_HEAP_SZ208
6.2.7 QUERY_HEAP_SZ208
6.3 监控和调优DB配置参数208
6.3.1 缓冲池大小209
6.3.2 日志缓冲区大小(LOGBUFSZ)215
6.3.3 应用程序堆大小(APPHEAPSZ)216
6.3.4 SORTHEAP和SHEAPTHRES217
6.3.5 锁相关配置参数219
6.3.6 活动应用程序的最大数目(MAXAPPLS)223
6.3.7 PKGCACHESZ224
6.3.8 CATALOGCACHE_SZ224
6.3.9 异步页清除程序的数目(NUM_IOCLEANERS)224
6.3.10 异步I/O 服务器的数目(NUM_IOSERVERS)226
6.3.11 组提交数目(MINCOMMIT)226
6.3.12 AVG_APPLS228
6.3.13 CHNGPGS_THRESH(DB)228
6.3.14 MAXFILOP229
6.3.15 LOGPRIMARY、LOGSECOND和LOGFILSZ229
6.3.16 STMTHEAP229
6.3.17 DFT_QUERYOPT229
6.3.18 UTIL_HEAP_SZ (DB)230
6.4 调整DB2概要注册变量230
6.4.1 DB2_PARALLEL_IO230
6.4.2 DB2_EVALUNCOMMITTED232
6.4.3 DB2_SKIPDELETED232
6.4.4 DB2_SKIPINSERTED232
6.4.5 DB2_USE_PAGE_CONTAINER_TAG233
6.4.6 DB2_SELECTIVITY233
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 捕获引起锁等待的SQL242
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 查询器重写示例：消除DISTINCT335
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 执行表、索引检查是否需要做REORG383
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 db2expln400
11.2.4 db2exfmt403
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 EXISTS414
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
DB2数据库性能调整和优化[1]