前言
为什么要写这本书
我早年毕业后,曾长期从事ERP、电子政务类软件的开发工作,作为一个数据库的使用者,我接触到了大量数据库,如FoxPro、SQL Server、Oracle、Informix……在不断的使用过程中,我对这一领域越来越感兴趣,并最终选择了数据库这条路。曾经长期担任DBA、数据库架构师等职,参与了大大小小很多项目的数据库设计、开发、优化工作,并在这一过程中积累了一些经验。在多年的工作中,我发现数据库领域存在一些现象。
现象一,开发人员将数据库视为“黑盒子”。开发人员不关心、不重视,也不了解SQL语句的执行情况、数据库的运行机理。甚至在很多O/R Mapping工具的辅助下,连基本的SQL语句也不需要手工编写。固然,通过引入这些工具可以大大加快研发速度,但其带来的弊端是,开发人员并不了解数据库是如何完成这些请求并获得数据的,优化更是无从谈起。
现象二,对SQL质量重视程度不足。我在长期的工作中发现,绝大多数公司对SQL质量的重视程度严重不足。往往在项目的前期设计、代码开发、测试等多个环节,都没有DBA的参与。直到项目上线,甚至到出现性能问题时,才会有DBA介入处理。这种救火员的模式,往往效果不好,即使有了解决方案,其代价、成本也必然是巨大的。
现象三,开发人员想提高却无从下手。有些开发人员认识到SQL语句质量的重要性,想要提高却无从下手。一方面,他们本身不具备数据库的专业知识;另一方面,SQL编程本身也有其特殊性,与其他常用开发语言有较大差异。正是这些因素,导致开发人员想要提高却困难重重。
现象四,重运行维护,轻开发优化。数据库的稳定运行、数据安全等是非常重要的,这也是DBA的核心职责之一。但对于开发优化,则往往存在重视程度不足的问题。我们经常会看到一个项目里,公司会花大笔费用购买昂贵的硬件、备份软件等,却不舍得购买与数据库优化、SQL审计相关的软件。此外,随着自动化运维的逐步推广,乃至数据库云服务的逐步成熟,传统意义的数据库运维工作必然会逐步萎缩,取而代之的则是数据库的设计、开发乃至整体架构工作逐步增多。这也是DBA未来发展的一个方向。
现象五,资料繁多,却无从选择。Oracle数据库在国内流行多年,该领域的书籍也非常多,但涉及优化类的相对较少,特别是局限在SQL语句优化范畴的。近年来我也发现了几本不错的书籍,但普遍存在技术偏深、可操作性不强的问题。广大数据库开发的初学者或者有一定经验但急需提高的读者,不太适用。
正是因为存在上述种种现象,促使我有了将多年的经验汇集成册,编写出版的想法。一方面是能够帮助有相关需求的人,另一方面也是对自己多年工作的一个总结。最后,希望这本书能够引领开发人员、DBA在SQL语句的编写优化上更进一步。倘若这本书能够帮助大家解决实际中遇到的问题,我将非常荣幸。
本书特色
本书从多角度阐述了SQL语句优化的方方面面,总体上可分为两大部分。第一部分主要讲解跟SQL优化相关的背景知识和基本原理;第二部分重点讲述了优化器的各种优化手段。本书整体具有以下几个特点:
- 书中内容由项目而生,以一线开发工程师的视角和言语展开。
- 注重实战。几乎所有的章节都配以代码,读者可在环境中直接编写代码并运行。大部分代码都附有详细的说明,便于读者理解内容。
- 涵盖了SQL语句的诸多方面,特别是第二部分,可作为工作手册供大家优化时查阅使用。
读者对象
本书适用于想要提高SQL语句运行效率乃至数据库整体性能的所有人,包括架构师、DBA、开发人员、测试人员等。书中讲解了Oracle数据库的SQL语句优化,但除了个别Oracle自有的优化特性外,其核心思想也适用于其他关系型数据库。书中没有讲解Oracle体系结构和SQL语言本身,这里假设大部分人已熟悉Oracle和SQL语言。具体来说,包括但不局限于下列人员:
- Oracle数据库开发人员;
- 数据库架构师、数据库管理员;
- 其他关系型数据库的从业者;
- 对SQL语句优化感兴趣的人员;
- 大专院校计算机相关专业的学生。
如何阅读本书
本书分为四大部分:
第一部分为引入篇(第0~1章)。
引言部分我结合多年的工作经验,总结了进行SQL语句优化时可能会面临的一些问题。读者可以观察是否在自己的身边也存在类似的问题。后面还讲述了一些常见的关于SQL优化的误区,以方便读者正确看待SQL语句优化。
第1章讲述了我曾经处理过的几个案例。通过这些活生生的案例,可以让读者更直观感受到SQL语句优化的重要。同时在每个案例后面,我还针对案例出现的问题进行了总结。
第二部分为原理篇(第2~9章)。
第2章讲述了SQL语句优化的核心组件——优化器,以及优化的最基础概念——成本。这部分非常重要,建议初学者仔细阅读。
第3~6章介绍了和优化相关的几个重要概念:执行计划、统计信息、SQL解析、游标、绑定变量。这部分都较为基础,建议初学者根据情况选择阅读。
第7~8章介绍了SQL语句的实体对象及物理上是如何存储的。这部分对于数据库结构设计有较大帮助。此外,在对SQL语句进行优化时,也需要考虑相关对象的情况,因为优化措施可能会影响该对象的其他语句,需要统筹考虑。
第9章介绍了Oracle专有的一些SQL语句。有时使用这些语句,可以达到意想不到的效果。如不考虑以后有数据库平台迁移的问题,可以充分利用这些语句。
原理篇是我们是迈入实战篇的基础,它几乎覆盖了SQL优化相关的所有原理知识。通过对这些内容的学习,可以为后面的优化部分打下良好的基础。如果你已经拥有相关知识,可以直接进入实战篇。
第三部分为实战篇(第10~16章)。它是本书的重点。
第10章介绍了一个重要的优化手段——查询转换。这部分相对来说比较难,相关资料说明较少,可作为重点来看。
第11章介绍了数据对象的访问方式。这部分也非常基础,应重点来看。
第12~16章介绍了多种操作及常见的优化手段,包括表关联、半/反连接、子查询、排序、并行等。这部分读者可根据实际需要进行有重点的阅读。
实战篇是本书的重点,这部分覆盖了常见优化的多个方面。读者可将这部分作为参考资料,当需要时反复阅读。这部分还包含了大量示例代码,读者可以通过实践反复体会。
本书还提供了读者可能感兴趣的拓展知识,放在附录。
附录介绍了前面各章节提到的数据库参数、数据字典、等待事件、提示等内容。此外,还包括如何构造样例数据,方便读者进行实际操作。
以上是本书各个章节的安排情况和写作思路,希望有助于读者阅读。
勘误和支持
由于笔者水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。大家可以通过邮箱hanfeng7766@sohu.com与我取得联系。你可以将书中的错误和问题反馈给我,我将尽量在线上为你提供最满意的解答。期待能够得到你的真挚反馈。
致谢
感谢每一位帮助过我的老师、同事和领导,是你们让我有了学习和总结的机会。感谢宜信公司的各级领导、同事对我的支持和鼓励,你们的支持充分体现了宜信开放、分享的企业文化。此外,也要感谢我的老东家——当当网,在那里我积累了丰富的经验,并坚定了完成本书的信心。
感谢机械工业出版社华章公司的编辑孙海亮,在这一年多的时间中始终支持我的写作。第一次著书写作,过程漫长而艰辛,正是你的鼓励和帮助引导我顺利完成全部书稿。
感谢远在哈尔滨的爸爸、妈妈和姐姐,是你们在艰苦环境下将我培养成人,并时时刻刻为我灌输爱的力量!感谢我的岳父母,是你们承担了琐碎的家务,让我能安心写作。最后,也是最重要的,一如既往地感谢陪伴我左右的妻子和孩子,你们的爱和支持是本书得以完成的最大动力。
谨以本书献给我最亲爱的家人和朋友,以及正在为自我实现而奋斗的、充满朝气的IT工程师们!
韩锋