新書推薦:
《
不被他人左右:基于阿德勒心理学的无压力工作法
》
售價:HK$
66.1
《
SDGSAT-1卫星热红外影像图集
》
售價:HK$
445.8
《
股市趋势技术分析(原书第11版)
》
售價:HK$
221.8
《
汉匈战争全史
》
售價:HK$
99.7
《
恶的哲学研究(社会思想丛书)
》
售價:HK$
109.8
《
不止江湖
》
售價:HK$
98.6
《
天才留步!——从文艺复兴到新艺术运动(一本关于艺术天才的鲜活故事集,聚焦艺术史的高光时刻!)
》
售價:HK$
154.6
《
双城史
》
售價:HK$
110.9
|
編輯推薦: |
Amazon全五星评价畅销书,由拥有20余年工作经验的资深数据库专家撰写,权威性毋庸置疑
详尽阐述了100余条SQL语句优化的技巧和最佳实践,以及编写高性能SQL语句的标准和原则,包含大量案例,为解决各种复杂的DB2性能问题提供了解决方案
|
內容簡介: |
这是一本不可多得的DB2数据库性能调优秘笈,由拥有20余年DB2工作经验的资深数据库专家撰写,Amazon全五星评价畅销书。本书不仅详尽阐述了100余条SQL语句优化的技巧和最佳实践、编写高性能SQL语句的标准和原则,以及DB2数据库性能优化的“15步法”,而且还包含大量案例,为解决各种复杂的DB2性能问题提供了解决方案。
全书共7章:第1章总结了116条优化SQL语句的技巧和最佳实践;第2章讲解了
SQL语句中提示的编写方法和技巧;第3章讲解了编写高质量SQL语句需要遵守的SQL标准和原则;第4章介绍了SQL程序走查;第5章用2个实例介绍了如何检查存在性;第6章介绍了Runstats,用来得到一些统计信息;第7章讲解了DB2性能优化的“15步调优法”,被誉为DB2性能调优领域的无价之宝,适用于各种情况下的性能调优问题。本书最后还有2个附录,分别介绍了谓词的重写示例和DB2
SQL中的术语。
|
關於作者: |
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.comtonyandrews12。
|
目錄:
|
译者序
前言
第1章 SQL优化技巧宝典100+
1. 去除在谓词列上编写的任何标量函数
2. 去除在谓词列上编写的任何数学运算
3. SQL语句的Select部分只写必要的列
4. 尽可能不用Distinct
5. 尽量将In子查询重写为Exists子查询
6.确保宿主变量定义为与列数据类型匹配
7. 由于优化工具处理“或”逻辑可能有问题,所以尽量采用其他方式重写
8. 确保所处理的表中数据分布和其他统计信息正确并反映当前状况
9. 尽可能用UNION ALL取代UNION
10. 考虑使用硬编码还是使用宿主变量
11. 尽可能减少DB2的SQL请求
12. 尽量将区间谓词重写为Between谓词
13. 考虑使用全局临时表
14. 优先使用Stage 1谓词而不是Stage 2谓词
15. 记住(某些)谓词的顺序很重要
16. 多个子查询排序
17. 索引关联子查询
18. 了解DB2 Explain工具
19. 使用工具进行监控
20. 采用提交和重启策略
21. 实现优良的索引设计
22. 避免与非列表达式不一致
23. 所有筛选逻辑放在应用代码之外
24. 确保涉及Min和Max的子查询谓词要处理可能返回Null的情况
25. 如果查询只选择数据,一定要把游标处理写为For Fetch Only(只获取)或For Read Only(只读)
26. 避免只是为了帮助确定代码逻辑应当执行更新还是插入而从表中选择一行
27. 避免只是为了得到更新值而从表中选择一行
28. 利用动态SQL语句缓存
29. 避免使用Select *
30. 当心可以为Null的列,还要当心SQL语句可能从数据库管理器返回Null
31. 尽量减少执行打开和关闭游标的次数
32. SQL中要避免非逻辑
33. 使用关联ID来保证更好的可读性
34. 保证表和索引文件合法而且有组织
35. 充分利用Update Where Current of Cursor和Delete Where Current of
Cursor
36. 使用游标时,利用多行获取、多行更新和多行插入来使用ROWSET定位和获取
37. 了解锁定隔离级别
38. 了解Null处理
39. 编程时要考虑性能
40.让SQL来处理
41.使用Lock Table
42. 考虑OLTP前端处理
43. 考虑使用动态可滚动游标
44. 利用物化查询表改善响应时间(只适用动态SQL)
45. 结合Select的Insert
46. 充分利用多行获取
47. 充分利用多行插入
48. 充分利用多行更新
49. 充分利用多行删除
50.在Select子句中使用标量全选
51. 在动态SQL中充分利用REOPT ONCE和REOPT AUTO,在静态SQL中充分利用REOPT VARS和REOPT
ALWAYS
52. 标识易失表
53. 使用ON COMMIT DROP改进
54. 使用多个Distinct
55. 充分利用反向索引扫描
56. 当心Like语句
57. 正确地设置聚簇索引
58. 必要时使用Group By表达式
59. 当心表空间扫描
60. 不要问你已经知道的信息
61. 注意查询中的表顺序
62. 使用左外联接而不是右外联接
63. 检查不存在的行
64. 使用存储过程
65. 不要只是为了排序而选择某一列
66. 尽可能限制结果集
67. 批量删除时充分利用DB2 V8的改进DISCARD功能
68. 充分利用DB2 LOAD工具完成批量插入
69. 注意视图、嵌套表表达式和公共表表达式的物化
70. 考虑压缩数据
71. 考虑并行性
72. 让STDDEV、STDDEV_SAMP、VAR和VAR_SAMP函数远离其他函数
73. 考虑使用ROWID数据类型V8或RID函数V9直接访问行
74. 用真实统计和一定的数据测试查询以反映性能问题
75. 在WHERE子句中指定前导索引列
76. 尽可能使用WHERE而不是HAVING完成筛选
77. 尽可能考虑Index Only处理
78. DB2 V9中表达式上的索引
79. 考虑DB2 V9 Truncate语句
80. 在子查询中使用DB2 V9 Fetch First和Order by
81. 利用DB2 V9乐观锁定
82. 使用DB2 V9 MERGE语句
83. 了解DB2 NOFOR预编译选项
84. 考虑Select Into中使用Order By
85. 尽量编写布尔项谓词
86. 编写传递闭包
87. 避免用Order By排序
88. 尽可能使用联接而不是子查询
89. 当心Case逻辑
90. 在Order By子句中充分利用函数
91. 了解你的DB2版本
92. 了解日期运算
93. 了解大容量插入选择
94. 了解Skip Locked Data(V9)避免锁定
95. 对输入流排序
96. 如果需要真正的唯一性,可以使用V8 Generate_Unique函数
97. 了解声明临时表的新选项
98. 执行Get Diagnostics时需要注意
99. 适当地对In列表排序
100. 结合Select的Update和Delete(V9
101. 只在必要时执行SQL语句
102. 充分利用内存中的表
103. 避开通用型SQL语句
104. 避免不必要的排序
105. 了解表达式和列函数
106. 结合使用谓词时要注意
107. 为搜索查询增加冗余谓词
108. 充分利用改进的动态缓存(V10)
109. 尝试当前提交来避免锁(V10)
110. 尝试使用系统时态表获取历史数据(V10)
111. 尝试使用业务时态表获取历史数据(V10)
112. 了解分级函数 V10
113. 充分利用扩展指示符(V10)
114. 得到更大的时间戳精度(V10)
115. 尝试Index Includes(V10)
116. 使用With Return to Client(V10)
第2章 DB2 SQL提示
1. 在SQL语句的最后使用Optimize for 1 Row语句
2. 为SQL查询增加A.PKEY = A.PKEY谓词,这里PKEY等于表的主键列
3. 更换索引选择
4. 改变表处理顺序
5. 使用分布式动态SQL
第3章 SQL标准和原则
面向COBOL开发人员
面向所有SQL开发人员
第4章 SQL程序走查
第5章 检查存在性
例1
例2
第6章 Runstats
第7章 查询初始调优步骤
附录A 谓词重写示例
附录B DB2 SQL术语
|
內容試閱:
|
大多数关系型数据库调优专家都认为,对于众多访问关系型数据库的应用来说,性能问题主要是因为程序编写不当,或者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编程的方法。
|
|