《PostgreSQL技术内幕:查询优化深度探索》前言

为什么写这本书

 

      我参加过很多次查询优化的培训,也查阅过不少查询优化的资料,但总是感觉对查询优化隔靴搔痒,似懂而非,我总结其中的原因是多数培训和资料的时长或篇幅较短,其内容多是对查询优化的概述,“巧妙”的避开了查询优化的难点,这都使得读者难以触及到查询优化的本质,导致查询优化的“大道理”人人都懂,但遇到问题却难以发力。

      在2016年末,我承担了一次查询优化的培训,结合之前培训的经验,我对这次查询优化的培训打了一个“持久战”,不只是仅仅拿出几个小时的时间对查询优化进行一个总体描述,而是将查询优化器拆解开来,分阶段的进行详细的解读,大约做了十几次培训,最终的效果实际上还是非常显著的。在培训的过程中我发现目前PostgreSQL数据库查询优化器的实现细节相关的资料在市场上少之又少,和数据库从业人员对查询优化器的热情远远不成正比,本着抛砖引玉的原则,我写了这本书。

 

为什么阅读这本书

           

  •             在数据库内核开发的过程中,你是否对查询优化器的实现细节有了解的欲望?
  •             在对数据库进行调优的过程中,你是否感觉无从下手?
  •             在分析查询优化的源码时,你是否会陷入某一细节而不可自拔?
  •             在学习查询优化的理论时,你是否感觉理论与实践之间无法一一对应?

      如果你希望深入的了解查询优化,那么最好的办法就是了解它的理论基础,然后细致的剖析查询优化器的源代码,通过理论和实践的结合,达到真正掌握相关知识的目的。本书则细致的解读了PostgreSQL10.0版本的查询优化器的大部分源码,对其中比较重要的理论都给出说明,相信已经足以让读者了解PostgreSQL数据库查询优化器的全貌。

      虽然本书已经尽量尝试通过比较多的图表、示例来将复杂问题简单化,但是鉴于PostgreSQL数据库的查询优化器的实现本身就具有一定的复杂性,我相信读者在阅读的过程肯定是“痛苦”的,但请相信梅花香自苦寒来,只要坚持阅读肯定能获得不菲的收获。

 

本书的组织结构

 

      本书的组织流程基本是按照PostgreSQL数据库的查询优化器处理一个查询的流程来解读的,按照由简入繁、由易入难的的情况进行组织。

      第一章介绍的是一些查询优化的基础理论,这些理论是对查询优化的概述,读者在阅读第一章时可以参考一些经典的数据库实现理论的相关书籍,更详细的了解数据库的基本理论,这样能给后面的阅读打好基础。

      第二章介绍的是查询树,查询树是PostgreSQL数据库查询优化器的输入,查询优化器本身是对查询树的等价改造以及等价分解。

      第三章介绍的是逻辑重写优化,逻辑重写优化属于逻辑优化的一部分,它主要是对查询树进行基于规则的等价重写,比较重要的包括子查询提升、表达式预处理、外连接消除等。

      第四章介绍的是逻辑分解优化,逻辑分解优化仍然属于逻辑优化的一部分,和逻辑重写优化不同,它开始尝试分解查询树,经过谓词下推、连接顺序交换、等价类推理等等对查询树进行改造。

      第五章介绍的是统计信息和选择率,统计信息是代价计算的基石,因此了解统计信息的类型、了解选择率的含义对了解代价计算的过程有非常重要的意义。

      第六章介绍的是扫描路径的建立过程,扫描路径是为了对基表进行扫描的物理算子创建的路径,它负责将物理存储或者缓存中的数据读取上来进行处理,通常包括顺序扫描、索引扫描、位图扫描等等。

      第七章介绍的是路径搜索的2个算法,PostgreSQL数据库采用了动态规划方法和遗传算法进行路径的搜索,本书对这两种方法的实现都做了详细的介绍。

      第八章介绍的是连接路径的建立过程,PostgreSQL数据库的物理连接路径有嵌套循环连接、哈希连接、归并连接等,由于采用的扫描路径不同,导致同一种类型的物理连接路径产生的代价不同。

      第九章介绍的是Non-SPJ的相关优化,PostgreSQL数据库对集合操作、聚集操作、分组操作、排序操作等都做了优化处理。

      第十章介绍的是执行计划的生成,在扫描路径、连接路径以及Non-SPJ路径分别处理之后,会选择出一个“最优”的连接树,PostgreSQL数据库需要将这个连接树修正成执行计划。

 

错误

 

      限于作者的能力,书中一定有不少错误,在写作的过程中我也尝试尽量的多查阅相关的资料,尽量避免错误的出现,但是相关的资料实在是太少了,因此,我欢迎广大的读者对本书提出纠正、批评和意见,这也有益于作者本身能力的提升。

 

致谢

 

      感谢彭煜玮、周正中(德哥)乐为做序,感谢蒋志勇、文继军、王颖泽、杨瑜为本书做的推荐,这对我是极大的鼓励。

      在书稿的写作过程中,卢栋栋、彭信东、李茂增通读了大部分书稿,给出了很多有益的意见和建议,在此表示感谢。 林文、翁岩青、白洁对书稿的格式以及内容提出了修改建议,在此一并表示感谢。

      感谢编辑董英,在本书的写稿以及后续的审校过程中一直是董英编辑和我沟通,不厌其烦的解答我的各种问题。

      感谢我的父母和妻子在我写作的过程中给予了极大的支持,写作的过程非常枯燥,他们给我提供了最好的写作环境,另外我的两个儿子邦邦和添添也经常在我离开电脑的间隙里帮我修改书稿,虽然他们的意见一条也没有被采纳,但仍然对他们的“贡献”表示感谢。

你可能感兴趣的:(点滴)