大多数关系型数据库调优专家都认为,对于众多访问关系型数据库的应用来说,性能问题主要是因为程序编写不当,或者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’s Guide》。
另外,非常感谢IBM出版社和我一同完成这本书的工作人员,感谢他们的理解和耐心。特别要感谢Mary Beth Ray、Steven Stansel、Christopher Cleveland以及参与这本书第一版的所有编辑和制作人员。要按照规定的所有格式和风格汇集成这样一本书,对我来说真不是一件容易的事。我发自内心地认为确实需要更高的Word处理水平才能胜任这个工作。
要感谢我任职的Themis公司(位于新泽西州的韦斯特菲尔德),感谢大家支持我完成这个项目。在我多年的培训和咨询生涯中,这是我遇到和共事过的水平最高、沟通最顺畅的一群技术人员。有了他们的协助,紧跟最新的版本与时俱进也成了一件乐事,出现问题时他们的第一手经验真是无价之宝。
另外,最重要的是,谢谢我亲爱的妻子Jan。是她帮助我建立信心、消除恐惧,鼓励我把在这么多项目中学到和实现过的方法公开出版,与大家分享。
如果你对本书有任何问题或评论,可以与我联系(tandrews@themisinc.com)。也可以写信给出版社转交给我。真诚期待你们的宝贵建议,实际上早在多年前做程序走查时我就已经感受到他人意见的重要性,从那时起就不敢再自以为是,衷心欢迎你的意见和反馈。本书的目的就是帮助广大开发人员了解各种高效DB2 SQL编程的方法。