首页>参考读物>计算机科学与技术>数据库

DB2 SQL性能调优秘笈
作者 : (美)Tony Andrews 著
译者 : 陈勇 杨健康 译
丛书名 : 华章程序员书库
出版日期 : 2013-06-09
ISBN : 978-7-111-42502-1
定价 : 39.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 172
开本 : 32
原书名 : DB2 SQL Tuning Tips for z/OS Developers
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

书中介绍了在构建DB2应用时与SQL相关的102条技巧。传奇DB2调优专家Tony Andrews有23年以上DB2调优经验,他在书中介绍了DB2查询和应用通常性能较低的原因,并阐释了如何避免这些瓶颈以解决问题。

图书特色

一本能帮助DBA和开发人员全面改善DB2数据库性能的调优秘笈,涵盖DB2 V9和V10

好的数据库性能往往是通过SQL代码进行优化而得到的。本书不仅为我们奉上了100多个与SQL代码优化相关的技巧和最佳实践,而且还深刻阐述了SQL编码的标准和原则,以及SQL语句调优的方法——15步调优法,可以说是无价之宝,几乎适用于任何DB2应用的优化。所有开发人员和DBA都可以通过本书的内容构建并优化DB2应用,以得到最优的性能。
本书的作者Tony Andrews即大名鼎鼎的“Tony the Tuner”,在数据库领域奋斗了20余年,在DB2性能调优方面积累了非常丰富的经验。在本书中,Tony清楚地告诉我们如何去应对各种与DB2相关的性能问题,如何去发现并消除性能上的瓶颈,而且还提供了大量经验性的解决方案。
本书中所讲解的技术从未在其他书中出现过,而且一般的DB2课程中也很少涵盖。
本书主要内容:
帮助开发人员了解在解决查询或程序中的性能问题时如何做,以及从哪里做起
提供大量编程和SQL编码示例
建立保证高性能SQL的标准和原则
实现高效的代码走查,确保遵循标准
关注耗费资源最多的少量SQL语句
找出能提供最大好处的简单解决方案
重写查询谓词使之更高效,从而优化性能
更好地理解SQL优化和Runstats统计
寻找机会,找到比优化工具更好的方法来调整代码,使之更高效
用COBOL应用优化SQL代码
高效地检查数据、行或表的存在性的技巧
使用Runstats的最新功能优化数据访问路径


作者简介
Tony Andrews 资深DB2数据库专家和培训导师,在DB2数据库应用开发领域摸爬滚打20余年,是DB2领域的权威,实践经验极为丰富。Tony专注于DB2数据库分析和性能调优,主要为一些财富500强公司和政府机构提供开发和咨询服务。在过去10年中,他把主要精力都放在了咨询和培训上,致力于为开发人员提供数据库设计与开发方面的指导,尤其是如何改善DB2数据库的性能。
Tony是IBM的金牌作者,经常在行业会议和当地用户组发表演讲,你可能在IDUG NA和EMEA上见过他,他的“Top 25+ Tuning Tips for Developers”演讲稿让他闻名于世。
Tony的网站:www.db2sqltuningtips.com; Twitter:www.twitter.com/tonyandrews12。

图书前言

大多数关系型数据库调优专家都认为,对于众多访问关系型数据库的应用来说,性能问题主要是因为程序编写不当,或者SQL编写有问题。业内专家还指出,80%的响应时间问题都应由性能差的SQL负责。我个人也非常赞同这种观点。我曾为很多IT工作室提供过性能和调优咨询服务,在所有这些工作室中,大多数性能问题都与修改应用和SQL代码直接相关,或者与增加和修改索引有关。正是因为这个原因,我一直在努力让开发人员了解各种SQL编程方法以及相关的性能问题。我认为应该让更多的开发人员了解如何阅读和分析DB2 Explain输出。另外,我相信对于每一个涉及RDMS的大型开发项目而言,项目组里都应该配备一个SQL技术专家。IT行业中的SQL开发人员并不少,不过从我的经验来看,我发现其中只有不到10%的人真正了解SQL编程中存在的性能问题,或者真正知道该如何修正这些问题。如果有一位SQL技术专家坐镇,很多性能和逻辑问题就能在迁移到生产版本之前及早发现。
  本书的出发点是为需要对SQL语句或程序调优的开发人员提供一个参考指南。一旦发现程序或应用运行很慢,大多数开发人员都会仓促地归咎于网络、数据库、系统或者过大的事务量等,把它们当作罪魁祸首。不过,很多情况下程序运行速度慢的直接原因其实在于他们的代码。希望本书能为这些开发人员提供帮助,使他们在迫不及待地给DBA或其他人打电话求助之前,能够先自己尝试来解决或改善遇到的性能问题。
  还有另外一种情况:尽管SQL(以及SQL Explain)看起来还不错,但实际效率很差。针对这些情况,本书还提供了一些“调优技巧”,这些技巧会采用与优化工具选用方法不同的方式对SQL进行调整优化。业界很多专家就经常使用这些技巧采用不同方式对原先性能表现很差的SQL语句进行优化,使它能更快地执行。有些情况下,修正性能问题的关键在于运行时间,这些调优技巧对于这种情况尤其适用。
  在本书中,我总结了我在众多IT工作室所采用的一组SQL标准和原则。如果你的IT工作室还没有建立任何SQL标准,可以把我提供的这些标准作为不错的起点。很多工作室都会针对他们的应用另外增加更多原则。
  有了标准和原则还不够,还需要确保遵循这些原则。我见过很多这样的IT工作室,开发人员向我展示了他们的SQL编程、COBOL编程、Java编程等等标准,但是并没有建立质量保证机制来确保这些标准确实得到实施。所有将进入生产阶段的程序都要经过某种代码走查或审查,以确保遵循标准,另外要保证所写的SQL确实高效。审查可以确保程序和SQL逻辑正确,还可以确保程序的设计符合需求。本书中专门有一章列出了完成SQL编程代码走查时需要询问和检查的各个问题。代码走查需要花一点时间,不过与可能在生产阶段暴露的性能或逻辑问题相比,代码走查绝对是值得的。
  很多情况下,开发人员希望对SQL代码调优,但是不知道从哪里做起。我会告诉他们,首先要查看各个查询中的所有谓词,尽可能编写得更为高效。本书提供了一个附录,其中列出了性能不好的SQL谓词,以及如何更高效地重写这些谓词。开发人员要知道一个谓词是可索引谓词还是不可索引谓词,另外要知道它是Stage 1谓词还是Stage 2谓词,这很重要。这些问题将在本书中详细讨论。
  与其说性能是一个DB2问题,还不如说它是一个关系型数据库问题。开发人员必须注意如何建立查询结构,以及如何基于这些查询设计应用代码。数据库分析人员和数据库建模人员必须注意如何设计一个数据库应用。他们需要花一些时间做充分的分析。性能取决于环境、应用和需求。另外,对于性能来说,没有最好,只有更好。尽管大多数调优都在操作系统级和数据库级进行,但是实际上对应用代码调优才能获得最大的性能收益。如果应用需要使用SQL从数据库中获取数据,这一类应用就非常适合进行调优。由于很少的SQL语句可能会占用大多数资源,所以SQL调优通常能得到显著的性能提升。不过,SQL调优有时可能相当复杂。本书会提供一个起点,力求简单,使开发人员能轻松上手,让SQL驱动的程序和应用更高效地执行。
免责声明
  本书中给出的调优技巧和建议是我个人的观点,这些都是根据我多年来完成DB2应用设计、编程和调优总结得出的。其中一些调优技巧可能并不完全反映IBM(以及相关组织或这个领域的专家)的看法和观点。这些调优技巧基于我个人的经验积累而成,在我参与的各个应用中频繁使用,使应用得到更好的性能。这100多个技巧中,每一个技巧我都曾在对DB2 SQL应用调优时使用过,力图使查询和程序更高效地执行。
  谈到一种方法好用或不好用时,很多人都会说“看情况”,相信每个人对此都不陌生。一定要谨记这一点。不要机械地照搬本书中的各个技巧,想当然地认为性能会立即改善。这些技巧是为了给开发人员指明方向,提供一些思路,以便他们改进查询或程序。所有人都要自己完成独立测试,验证本书中一些说法的正确性,只有在验证了这些说法确实正确的前提下,才能依此做出判断和决策。
致谢
  我要向这些年来与我共事过的广大开发人员和DBA致以深深的谢意。我是程序设计走查和程序代码走查的忠实拥护者。就我个人而言,多年来与其他同事坐在一起讨论、采纳他们关于程序改善的建议,期望改进得到最好、最高效的代码而顺利进入生产阶段,这些让我学到了很多很多。多年前,我们在一起开发一些庞大的应用时,他们就催促我把经验总结下来。后来我不断在会议上或者通过邮件为我们的开发小组提供关于编码技术的技巧,以改善他们的查询和程序性能。最后,终于有一天他们都劝说我应把这些技巧汇集成一本书。
  我要特别感谢完成技术编辑的Chuck Kosin和David Simpson。他们是我认识的DB2领域最棒的技术人员,他们能加入这个项目真是我的荣幸。非常感谢他们给出的大量评论和建议,正是这些意见让这本书更出色。我认识David已经有3年多了,我们曾在Themis Inc共事过。说心里话,他是我在这个行业见过的知识最渊博、最有经验的DB2专家之一。Chuck有非常深厚的技术背景,之前就曾做过技术编辑,他与Craig Mullins共同编辑了《DB2 Developer抯 Guide》。
  另外,非常感谢IBM出版社和我一同完成这本书的工作人员,感谢他们的理解和耐心。特别要感谢Mary Beth Ray、Steven Stansel、Christopher Cleveland以及参与这本书第一版的所有编辑和制作人员。要按照规定的所有格式和风格汇集成这样一本书,对我来说真不是一件容易的事。我发自内心地认为确实需要更高的Word处理水平才能胜任这个工作。
  要感谢我任职的Themis公司(位于新泽西州的韦斯特菲尔德),感谢大家支持我完成这个项目。在我多年的培训和咨询生涯中,这是我遇到和共事过的水平最高、沟通最顺畅的一群技术人员。有了他们的协助,紧跟最新的版本与时俱进也成了一件乐事,出现问题时他们的第一手经验真是无价之宝。
  另外,最重要的是,谢谢我亲爱的妻子Jan。是她帮助我建立信心、消除恐惧,鼓励我把在这么多项目中学到和实现过的方法公开出版,与大家分享。
  如果你对本书有任何问题或评论,可以与我联系(tandrews@themisinc.com)。也可以写信给出版社转交给我。真诚期待你们的宝贵建议,实际上早在多年前做程序走查时我就已经感受到他人意见的重要性,从那时起就不敢再自以为是,衷心欢迎你的意见和反馈。本书的目的就是帮助广大开发人员了解各种高效DB2 SQL编程的方法。

上架指导

计算机\数据库

封底文字

一本能帮助DBA和开发人员全面改善DB2数据库性能的调优秘笈,涵盖DB2 V9和V10。

好的数据库性能往往是通过SQL代码进行优化而得到的。本书不仅为我们奉上了100多个与SQL代码优化相关的技巧和最佳实践,而且还深刻阐述了SQL编码的标准和原则,以及SQL语句调优的方法——15步调优法,可以说是无价之宝,几乎适用于任何DB2应用的优化。所有开发人员和DBA都可以通过本书的内容构建和优化DB2应用,以得到最优的性能。
本书的作者Tony Andrews即大名鼎鼎的“Tony the Tuner”,在数据库领域奋斗了20余年,在DB2性能调优方面积累了非常丰富的经验。Tony能清楚地告诉我们如何去应对各种与DB2相关的性能问题,如何去发现并消除性能上的瓶颈,提供了大量经验性的解决方案。
本书中所讲解的技术从未在其他书中出现过,而且一般的DB2课程中也很少涵盖。本书主要内容:
 帮助开发人员了解在解决查询或程序中的性能问题时如何做,以及从哪里做起
 提供大量编程和SQL编码示例
 建立保证高性能SQL的标准和原则
 实现高效的代码走查确保遵循标准
 关注耗费最多资源的少量SQL语句
 找出能提供最大好处的简单解决方案
 重写查询谓词使之更高效,从而优化性能
 更好地理解SQL优化和Runstat统计
 寻找机会,找到比优化工具更好的方法来调整代码,使之更高效
 用COBOL应用优化SQL代码
 高效地检查数据、行或表的存在性
 使用Runstats的最新功能优化数据访问路径

作者简介

(美)Tony Andrews 著:暂无简介

译者简介

陈勇 杨健康 译:暂无简介

译者序

拿到这本书,你可能会有这样的疑惑:这么一本薄薄的小书能告诉我们什么?真的能像作者所说的那样是一本不可多见的调优技巧秘笈吗?要回答这些疑问,最好的办法就是翻开书,自己研读,自己给出答案。
  也许你在为应用的调优一筹莫展,也许你在惊异于调优专家的妙手回春,也许你在四处探求应用调优的秘诀,也许你有志于调优却不知从何做起……你手上的这本书会帮你解除疑惑,带你步入调优世界。
  这本书的作者是著名的“Tony the Tuner”—Tony Andrews,他在DB2领域奋战了20多年,现在将他积累的经验凝结成书中的100多个SQL优化技巧,利用这些技巧,我们可以用最佳的方式构建和优化DB2应用。通过大量示例,他为我们展示了DB2 SQL调优中的种种问题和解决方案,强调了通常被忽略但意义重大的诸多方面,比如建立标准和原则,实现代码走查、重写查询谓词等等。相信这本书能帮你拨开谜团,享受成功调优的乐趣。
  本书由陈勇、杨健康主译,程芳、吴忠望、张练达、陈峰、江健、姚勇、张莹参与了全书的修改整理,并完善了关键部分的翻译。全体人员共同完成了本书的翻译工作。不过由于水平有限,译文肯定有不当之处,敬请批评指正。

图书目录

译者序
前言
第1章 SQL优化技巧宝典100+ 1
1. 去除在谓词列上编写的任何标量函数 3
2. 去除在谓词列上编写的任何数学运算 4
3. SQL语句的Select部分只写必要的列 4
4. 尽可能不用Distinct 5
5. 尽量将In子查询重写为Exists子查询 7
6.确保宿主变量定义为与列数据类型匹配 7
7. 由于优化工具处理“或”逻辑可能有问题,所以尽量采用其他方式重写 8
8. 确保所处理的表中数据分布和其他统计信息正确并反映当前状况 9
9. 尽可能用UNION ALL取代UNION 11
10. 考虑使用硬编码还是使用宿主变量 12
11. 尽可能减少DB2的SQL请求 13
12. 尽量将区间谓词重写为Between谓词 15
13. 考虑使用全局临时表 16
14. 优先使用Stage 1谓词而不是Stage 2谓词 18
15. 记住(某些)谓词的顺序很重要 20
16. 多个子查询排序 21
17. 索引关联子查询 22
18. 了解DB2 Explain工具 23
19. 使用工具进行监控 24
20. 采用提交和重启策略 24
21. 实现优良的索引设计 25
22. 避免与非列表达式不一致 26
23. 所有筛选逻辑放在应用代码之外 27
24. 确保涉及Min和Max的子查询谓词要处理可能返回Null的情况 28
25. 如果查询只选择数据,一定要把游标处理写为For Fetch Only(只获取)或For Read Only(只读) 29
26. 避免只是为了帮助确定代码逻辑应当执行更新还是插入而从表中选择一行 30
27. 避免只是为了得到更新值而从表中选择一行 31
28. 利用动态SQL语句缓存 31
29. 避免使用Select * 32
30. 当心可以为Null的列,还要当心SQL语句可能从数据库管理器返回Null 33
31. 尽量减少执行打开和关闭游标的次数 34
32. SQL中要避免非逻辑 34
33. 使用关联ID来保证更好的可读性 35
34. 保证表和索引文件合法而且有组织 36
35. 充分利用Update Where Current of Cursor和Delete Where Current of Cursor 36
36. 使用游标时,利用多行获取、多行更新和多行插入来使用ROWSET定位和获取 37
37. 了解锁定隔离级别 38
38. 了解Null处理 40
39. 编程时要考虑性能 42
40.让SQL来处理 42
41.使用Lock Table 43
42. 考虑OLTP前端处理 44
43. 考虑使用动态可滚动游标 45
44. 利用物化查询表改善响应时间(只适用动态SQL) 47
45. 结合Select的Insert 49
46. 充分利用多行获取 50
47. 充分利用多行插入 52
48. 充分利用多行更新 53
49. 充分利用多行删除 55
50.在Select子句中使用标量全选 55
51. 在动态SQL中充分利用REOPT ONCE和REOPT AUTO,在静态SQL中充分利用REOPT VARS和REOPT ALWAYS 57
52. 标识易失表 58
53. 使用ON COMMIT DROP改进 59
54. 使用多个Distinct 60
55. 充分利用反向索引扫描 60
56. 当心Like语句 61
57. 正确地设置聚簇索引 61
58. 必要时使用Group By表达式 63
59. 当心表空间扫描 64
60. 不要问你已经知道的信息 64
61. 注意查询中的表顺序 65
62. 使用左外联接而不是右外联接 66
63. 检查不存在的行 67
64. 使用存储过程 68
65. 不要只是为了排序而选择某一列 70
66. 尽可能限制结果集 70
67. 批量删除时充分利用DB2 V8的改进DISCARD功能 70
68. 充分利用DB2 LOAD工具完成批量插入 71
69. 注意视图、嵌套表表达式和公共表表达式的物化 72
70. 考虑压缩数据 74
71. 考虑并行性 75
72. 让STDDEV、STDDEV_SAMP、VAR和VAR_SAMP函数远离其他函数 76
73. 考虑使用ROWID数据类型(V8)或RID函数(V9)直接访问行 77
74. 用真实统计和一定的数据测试查询以反映性能问题 78
75. 在WHERE子句中指定前导索引列 80
76. 尽可能使用WHERE而不是HAVING完成筛选 81
77. 尽可能考虑Index Only处理 82
78. DB2 V9中表达式上的索引 83
79. 考虑DB2 V9 Truncate语句 84
80. 在子查询中使用DB2 V9 Fetch First和Order by 85
81. 利用DB2 V9乐观锁定 85
82. 使用DB2 V9 MERGE语句 87
83. 了解DB2 NOFOR预编译选项 89
84. 考虑Select Into中使用Order By 89
85. 尽量编写布尔项谓词 90
86. 编写传递闭包 90
87. 避免用Order By排序 91
88. 尽可能使用联接而不是子查询 92
89. 当心Case逻辑 92
90. 在Order By子句中充分利用函数 93
91. 了解你的DB2版本 93
92. 了解日期运算 94
93. 了解大容量插入选择 95
94. 了解Skip Locked Data(V9)避免锁定 96
95. 对输入流排序 97
96. 如果需要真正的唯一性,可以使用V8 Generate_Unique函数 98
97. 了解声明临时表的新选项 98
98. 执行Get Diagnostics时需要注意 99
99. 适当地对In列表排序 100
100. 结合Select的Update和Delete(V9) 100
101. 只在必要时执行SQL语句 101
102. 充分利用内存中的表 101
103. 避开通用型SQL语句 102
104. 避免不必要的排序 102
105. 了解表达式和列函数 103
106. 结合使用谓词时要注意 103
107. 为搜索查询增加冗余谓词 103
108. 充分利用改进的动态缓存(V10) 104
109. 尝试当前提交来避免锁(V10) 106
110. 尝试使用系统时态表获取历史数据(V10) 107
111. 尝试使用业务时态表获取历史数据(V10) 109
112. 了解分级函数 (V10) 110
113. 充分利用扩展指示符(V10) 112
114. 得到更大的时间戳精度(V10) 113
115. 尝试Index Includes(V10) 114
116. 使用With Return to Client(V10) 114
第2章 DB2 SQL提示 116
1. 在SQL语句的最后使用Optimize for 1 Row语句 117
2. 为SQL查询增加A.PKEY = A.PKEY谓词,这里PKEY等于表的主键列 118
3. 更换索引选择 119
4. 改变表处理顺序 121
5. 使用分布式动态SQL 122
第3章 SQL标准和原则 125
面向COBOL开发人员 125
面向所有SQL开发人员 129
第4章 SQL程序走查 135
第5章 检查存在性 139
例1 139
例2 141
第6章 Runstats 143
第7章 查询初始调优步骤 146
附录A 谓词重写示例 150
附录B DB2 SQL术语 153

参考读物推荐
作者: [美]塔里克·法鲁克(Tariq Farooq),[美]查尔斯·金(Charles Kim),[印度]尼廷·文格勒卡(Nitin Vengurlekar),[印度]斯里达尔·阿万查(Sridhar Avantsa),[澳]盖伊·哈里森(Guy Harrison),[美]赛义德·加法尔·侯赛因(Syed Jaffar Hussain)著
作者: Robert J.Muller蓍
作者: 红丸 著