数据库高效优化:架构、规范与SQL技巧
上QQ阅读APP看书,第一时间看更新

前言

为什么要写这本书

我曾长期从事ERP、电子政务类软件的开发工作,作为数据库的深度使用者,接触到大量数据库,如FoxPro、SQLServer、Oracle、Informix……在实践过程中,对这一领域也愈发感兴趣,并最终选择从事数据库相关工作。我曾长期担任多家公司DBA、数据库架构师,参与过很多项目的数据库设计、开发、优化工作,并在这一过程中积累了不少经验。特别是近期的一段工作经历,让我有机会将之前对数据库的很多想法积累沉淀下来,与此同时,我还和团队伙伴一起不断实践改进,也取得了不错的效果。

在多年的工作中,我发现数据库领域存在一些现象。

现象一,开发人员将数据库视为“黑盒子”。开发人员不关心、不重视数据库,也不了解SQL语句的执行情况、数据库的运行机制,甚至因为引入很多ORM工具,导致开发人员不了解数据库是如何完成请求并获得数据的,优化自然无从谈起。

现象二,SQL优化只是DBA的事情。在很多设计、开发、测试人员的眼中,SQL优化只是DBA的事情,他们不需要去关心。反映到具体工作中,他们缺乏相应的优化意识,只注重功能的实现而忽略了相应的执行成本。最终的结果往往就是代码质量不高,软件上线后问题多。

现象三,盲目优化。有些公司很重视SQL优化工作,但又缺乏必要的技术投入。经常见到这样的开发规范——所有WHERE条件字段都必须加上索引,结果就是数据库被“过分”优化,适得其反。

现象四,SQL优化很简单。有些人认为SQL优化很简单,甚至觉得SQL优化就是加索引的事!我就曾遇到因为索引过多导致执行性能低的案例。

现象五,硬件技术发展很快,不用再计较SQL优化。硬件技术近年来发展迅速,使得服务器的处理能力有了极大的提升。但我们要清醒地看到,SQL优化才是问题的根本解决之道。

现象六,开发人员想提高SQL语句质量却无从下手。有些开发人员认识到了SQL语句质量的重要性,想要提高却无从下手。一方面,他们本身不具备数据库的专业知识;另一方面,SQL编程本身也有其特殊性,与其他常用开发语言有较大差异。正是这些因素,导致开发人员想要提高SQL语句质量却困难重重。

现象七,重运行维护,轻开发优化和架构设计。大多公司意识到了数据库的重要性,但往往只重视运维而忽视了前期的架构设计、开发优化。我们经常会看到一个项目中,公司会花大笔费用购买昂贵的硬件、备份软件等,却不舍得购买与数据库优化、SQL审计相关的软件。此外,随着自动化运维的逐步推广以及数据库云服务的逐渐成熟,传统意义的数据库运维工作必然会逐步萎缩,取而代之的则是数据库的设计、开发乃至整体架构开发。这也是DBA未来发展的一个方向。

现象八,资料繁多,却无从选择。Oracle数据库在国内流行多年,该领域的书也非常多,但涉及优化书的相对较少,特别是局限在SQL语句优化范畴的。近年来,我也发现了几本不错的书,但普遍存在技术偏深、可操作性不强的问题,对于广大数据库开发的初学者或者有一定经验但急需提高的从业者不太适用。

上述种种现象促使我有了将多年的经验汇集成册、编写出版的想法。一方面是能够帮助有相关需求的人,另一方面也是对自己多年的工作进行总结。最后,希望这本书能够引导开发人员、DBA在SQL语句的编写优化上能有进一步提高。倘若本书能够帮助大家解决实际工作中遇到的问题,我将非常荣幸。

本书特色

本书具有以下几个特点:

·书中内容由项目而生,以一线开发工程师的视角展开。

·注重实战。几乎所有的章节都配有代码,读者可在实际工作环境中直接编写代码并运行。大部分代码附有详细的说明,便于读者理解。

·涵盖了SQL语句的诸多方面,特别是第二部分,可作为工作手册供大家优化时查阅使用。

读者对象

本书主要讲解了与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优化相关的所有原理知识。通过对这些内容的学习,读者可以为后面的SQL优化打下良好的基础。如果你已经拥有相关知识基础,可以直接进入实践篇。

第三部分为SQL篇(第10~16章)。

第10章介绍了一个重要的优化手段——查询转换。这章内容相对来说比较难,市面上相关资料较少,可作为重点来看。

第11章介绍了数据对象的访问方式。这章内容非常基础,也可作为重点来看。

第12~16章介绍了多种操作及常见的优化手段,包括表关联、半/反连接、子查询、排序、并行等。对于这部分内容,读者可根据实际需求有重点地阅读。

第四部分为实践篇(第17~22章)。

第17章针对不同的数据库,如Oracle及MySQL等,详细介绍如何从其结构设计、SQL开发等方面制定一系列的规范,目的是让一线的架构、研发、运维人员有章可循。

第18章主要分析建立完善的数据库架构评估模型的方法。通过建立性能基线和业务压力模型来模拟压力测试,以及根据测试结果来确定优化方案。根据性能问题的相关特征,如整体或局部、偶尔慢还是持续慢等,从语句级、对象级、数据库级、数据库架构级、应用架构级、业务架构级等维度逐层分析,找到问题的瓶颈点。

第19章主要介绍勾勒数据库画像的方法。数据库画像,即依托于现有的数据库对象、语句、访问特征、性能表现等进行数据的采集和分析,帮助我们形成对数据库的基本认知,并据此来制定运维管理策略、技术方案、迁移方案以及工作量等。

第20~22章深度剖析打造数据库审核平台的方法。借助平台设定的审核规则,我们可以快速发现数据库中潜在的风险。对于研发人员而言,可以借助平台来定位问题,并且达到辅助设计和开发工作的目的。对于DBA而言,可以借助平台快速掌握多个系统的整体情况,批量筛选低效SQL,以及快速诊断一般性问题。

附录部分介绍了前面各章节提到的数据库参数、数据字典、等待事件、提示等内容,以及如何构造样例数据,方便读者实际操作。

以上是本书各章的要点和写作思路,希望有助于读者阅读。

勘误和支持

由于水平有限,加之编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。大家可以通过邮箱hanfeng7766@126.com与我取得联系,我将尽量为大家提供满意的解答。期待能够得到大家的真挚反馈。

致谢

首先要特别感谢本书另外两位作者,因为他们与我共同努力,才有了本书的出版。其中,高振娇老师在数据库优化方面拥有丰富的实战经验,她把自己多年的心得都凝聚成文字,毫无保留地融入本书,在此感谢她的无私付出;马立和老师在本书撰写过程中也付出很多,在此对他的无私付出表示感谢。

其次要感谢每位帮助过我及另外两位作者的老师、同事,是你们让我们有了学习和总结的机会。感谢宜信公司的各级领导对我们的支持和鼓励,这也充分体现了宜信开放、分享的企业文化。

还要感谢机械工业出版社华章公司的编辑孙海亮,在这一年多的时间中耐心支持我们的写作。写作过程漫长而艰辛,正是你的鼓励和帮助,引导我们顺利完成全部书稿。

更要感谢曾经的宜信数据库团队的小伙伴们,你们在工作上团结一致、勇于实践,在技术上不断突破。正是这样一支朝气蓬勃的团队,在不断鞭策我努力前行。同时,我也很欣慰地看到团队成员的快速成长。目前,他们都在各大IT公司发挥着中坚骨干的作用。这里一并感谢郑继伟、王琦、袁友、邵航、俄广宁、赵玉龙、邢兆柳、金京、荣淮海、孙帅佳、林绅武等(排名不分前后)。

最后,谨以本书献给我及团队成员的家人和朋友,以及正在为自我实现而奋斗的、充满朝气的IT工程师们!

韩锋