PostgreSQL技术内幕:查询优化深度探索
基本信息
【插图】

编辑推荐
囊括源码解析、架构分析、关键细节、一线案例
深入浅出全面解读了PostgreSQL查询优化器
作者是数据库内核研发领域的一个老兵
拥有十多年一线数据库开发经验
对数据库内核各个方面都有研究
书中凝结了其对数据库的深刻理解
彭煜玮、周正中(德哥Digoal)倾情作序
蚂蚁金服、京东、阿里巴巴等业内专家力荐
不懂优化器不能算懂数据库
PostgreSQL优化器是一种教科书式的实现
值得数据库技术人员深入研究
内容简介
计算机书籍
查询优化器是数据库中很重要的模块之一,只有掌握好查询优化的方法且了解查询优化的细节,在对数据库调优的过程中才能有的放矢,否则调优的过程就如无本之木、无源之水,虽上下求索而不得其法。
《PostgreSQL技术内幕:查询优化深度探索》揭示了PostgreSQL数据库中查询优化的实现技术细节,首先对子查询提升、外连接消除、表达式预处理、谓词下推、连接顺序交换、等价类推理等逻辑优化方法进行了详细描述,然后结合统计信息、选择率、代价对扫描路径创建、路径搜索方法、连接路径建立、Non-SPJ路径建立、执行计划简化与生成等进行了深度探索,使读者对PostgreSQL数据库的查询优化器有深层次的了解。
《PostgreSQL技术内幕:查询优化深度探索》适合数据库内核开发人员及相关领域的研究人员、数据库DBA、高等院校相关专业的本科生或者研究生阅读。
作译者
目录
1.1 查询优化的简介 1
1.2 逻辑优化 3
1.2.1 关系模型 3
1.2.2 逻辑优化示例 8
1.3 物理优化 10
1.3.1 物理优化的4个"法宝" 12
1.3.2 物理路径的生成过程 14
1.4 文件介绍 17
1.5 示例的约定 18
1.6 小结 19
第2章 查询树 20
2.1 Node的结构 20
2.2 Var结构体 21
2.3 RangeTblEntry结构体 23
2.4 RangeTblRef结构体 25
2.5 JoinExpr结构体 26
2.6 FromExpr结构体 27
2.7 Query结构体 27
2.8 查询树的展示 31
前言
我参加过很多次查询优化的培训,也查阅过很多查询优化的资料,但总是感觉对查询优化似懂而非,我总结其原因是多数培训和资料的时长或篇幅较短,内容多是对查询优化的概述,"巧妙"地避开了查询优化的难点,难以触及查询优化的本质,导致查询优化的"大道理"人人都懂,遇到问题却难以发力。
2016年年末,我做了一次查询优化的培训,结合之前培训的经验,我对这次查询优化的培训打了一个"持久战",不只是拿出几个小时的时间对查询优化进行一个总体描述,而是将查询优化器拆解开来,分阶段地进行详细的解读,大约做了十几次培训,最终的效果是非常显著的。在培训的过程中我发现,目前PostgreSQL数据库查询优化器实现细节相关的资料市场上少之又少,和数据库从业人员对查询优化器的热情远远不成正比,本着抛砖引玉的原则,我写了这本书。
为什么阅读这本书
√ 在数据库内核开发的过程中,你是否有了解查询优化器的实现细节的欲望?
√ 在对数据库进行调优的过程中,你是否感觉无从下手?
√ 在分析查询优化的源码时,你是否会陷入某一细节而不可自拔?
√ 在学习查询优化的理论时,你是否感觉理论与实践之间无法一一对应?
如果你希望深入地了解查询优化,那么最好的办法就是了解它的理论基础,然后细致地剖析查询优化器的源代码,通过理论和实践的结合,达到真正掌握相关知识的目的。本书细致地解读了PostgreSQL 10.0的查询优化器的大部分源码,对其中比较重要的理论都给出了说明,足以让读者了解PostgreSQL数据库查询优化器的全貌。
虽然本书已经尽量尝试将复杂问题简单化,但是鉴于PostgreSQL数据库的查询优化器的实现本身就具有一定的复杂性,读者阅读的过程可能是"痛苦"的,但请相信"梅花香自苦寒来",只要坚持阅读就能收获很多。
本书的组织结构
本书的组织结构基本是按照PostgreSQL数据库的查询优化器处理一个查询的流程来安排的,由简入繁、由易入难。
第1章介绍一些查询优化基础理论,这些理论是对查询优化的概述,读者在阅读第1章时可以参考一些经典的数据库实现理论书籍,更详细地了解数据库的基本理论,这样能给后面的阅读打好基础。
第2章介绍查询树,查询树是PostgreSQL数据库查询优化器的输入,查询优化器本身是对查询树的等价改造及等价分解。
第3章介绍逻辑重写优化,逻辑重写优化是逻辑优化的一部分,它主要是对查询树进行基于规则的等价重写,比较重要的有子查询提升、表达式预处理、外连接消除等。
第4章介绍逻辑分解优化,逻辑分解优化仍然是逻辑优化的一部分,和逻辑重写优化不同,它开始尝试分解查询树,经过谓词下推、连接顺序交换、等价类推理等对查询树进行改造。
第5章介绍统计信息和选择率,统计信息是代价计算的基石,因此了解统计信息的类型、了解选择率的含义对代价计算有非常重要的意义。
第6章介绍扫描路径的建立过程,扫描路径是为了对基表进行扫描的物理算子创建的路径,它负责将物理存储或者缓存中的数据读取上来并进行处理,通常包括顺序扫描、索引扫描、位图扫描等。
第7章介绍路径搜索的两个算法,PostgreSQL数据库采用了动态规划方法和遗传算法进行路径搜索,本书对这两种方法的实现都做了详细的介绍。
第8章介绍连接路径的建立过程,PostgreSQL数据库的物理连接路径有嵌套循环连接、哈希连接、归并连接等,由于采用的扫描路径不同,导致同一种类型的物理连接路径产生的代价不同。
序言
查询可以说是数据库管理系统中最关键、最吸引人的功能之一,每一个生产数据库系统每天都需要处理大量的各类查询,为了让这些查询运行得更快、更好,数据库管理系统的查询优化器中包含了大量的优化技术,这些优化技术是很多研究者和技术人员数十年钻研和探索总结出来的精华。不论是数据库管理系统的开发者还是数据库应用的开发者,学习理解查询优化技术都大有裨益。
作为最先进的开源对象关系型数据库管理系统,PostgreSQL及其源代码无疑是学习和体会查询优化技术的最佳平台。除此之外,高质量技术书籍也是研究查询优化技术必不可少的武器。本书结合PostgreSQL的查询优化器源代码,深入分析了一个查询进入PostgreSQL之后一步步被查询优化器转换成一个可执行的、优化后的执行计划的全过程。为了让读者更容易理解,本书还配备了大量的实例来讲解,确实是一部值得一读的好书。
身为一名PostgreSQL爱好者和数据库研究人员,我感到无比幸福和自豪-据我有限的知识,全球仅有几本分析PostgreSQL内核的书籍,而它们全都出自中国作者之手。希望今后有更多、更好的此类书籍面世,也祝愿中国的数据库技术和产品有朝一日能够走向世界。
彭煜玮
2018.4.25于珞珈山
序二
中国有句古话,"巧妇难为无米之炊",说的是再好的主妇,在没有给任何食材的情况下也做不出可口的饭菜。反过来,什么样的主妇算得上"巧妇"呢?如果给你准备好了烹调所需的所有食材,你能做出可口的饭菜吗?
数据库是一个比较神奇的软件,我们都知道可以用SQL和数据库沟通,让数据库处理SQL和让主妇做饭是一样的道理,数据库能不能及时响应SQL请求,能不能用最优的计划完成SQL请求,取决于数据库本身提供了哪些"料",以及数据库打算怎么"烹调"用户提交的SQL。例如,一个简单查询SQL,数据库的扫描方法(我暂且把它称为数据库的"料"之一)就有全表扫描、索引扫描、位图扫描、跳跃扫描等。一个SQL中包括了多个函数、表达式时,数据库先处理哪个表达式或函数,又或者在什么时候处理这些表达式或函数呢?数据库"烹调"一条SQL时,如何"烹调",如何分解,是靠什么来做决定的?在数据库决定了怎么做之后,又是如何按部就班地执行的?如果说数据库的"扫描方法、表达式、操作符、UDF、索引接口"等是数据库的"料",那么数据库的优化器就是"巧妇"之手,它包括了"JOIN算法、SQL重写规则、多表JOIN的遗传算法、动态路径规划、选择性算法、各种NODE的成本计算算法、成本因子、并行计算成本算法"等方方面面,为数据库如何执行SQL提供了全套流程。
PostgreSQL作为一个非常经典的ORDBMS,包含了很多"料",同时有着非常先进的优化器,为高效地执行SQL提供了良好的基础。
本书作者长期致力于数据库内核的研发,有非常丰富的理论与实践经验,本书以PostgreSQL为背景,详细介绍了PostgreSQL查询优化器中的核心概念,从"查询树、SQL重写、UNION 优化、逻辑分解"到"下推、JOIN、选择性、统计信息、扫描路径、动态规划、遗传算法"等方方面面,实为作者呕心沥血之作,同时也是数据库工作者,特别是PGer之福。
本书是不可多得的教科书级PostgreSQL内核读物,同时不乏实战性。建议想了解数据库优化器工作原理的读者及PostgreSQL爱好者深入学习。
感谢作者为PostgreSQL生态的辛勤付出,期待本书大卖。
PGer,Digoal
媒体评论
查询可以说是数据库管理系统中*关键、*吸引人的功能之一,每一个生产数据库系统每天都需要处理大量的各类查询,为了让这些查询运行得更快、更好,数据库管理系统的查询优化器中包含了大量的优化技术,这些优化技术是很多研究者和技术人员数十年钻研和探索总结出来的精华。不论是数据库管理系统的开发者还是数据库应用的开发者,学习理解查询优化技术都大有裨益。
作为*的开源对象关系型数据库管理系统,PostgreSQL及其源代码无疑是学习和体会查询优化技术的*平台。除此之外,高质量技术书籍也是研究查询优化技术必不可少的武器。本书结合PostgreSQL的查询优化器源代码,深入分析了一个查询进入PostgreSQL之后一步步被查询优化器转换成一个可执行的、优化后的执行计划的全过程。为了让读者更容易理解,本书还配备了大量的实例来讲解,确实是一部值得一读的好书。
身为一名PostgreSQL爱好者和数据库研究人员,我感到无比幸福和自豪—据我有限的知识,全球仅有几本分析PostgreSQL内核的书籍,而它们全都出自中国作者之手。希望今后有更多、更好的此类书籍面世,也祝愿中国的数据库技术和产品有朝一日能够走向世界。序一
查询可以说是数据库管理系统中*关键、*吸引人的功能之一,每一个生产数据库系统每天都需要处理大量的各类查询,为了让这些查询运行得更快、更好,数据库管理系统的查询优化器中包含了大量的优化技术,这些优化技术是很多研究者和技术人员数十年钻研和探索总结出来的精华。不论是数据库管理系统的开发者还是数据库应用的开发者,学习理解查询优化技术都大有裨益。
作为*的开源对象关系型数据库管理系统,PostgreSQL及其源代码无疑是学习和体会查询优化技术的*平台。除此之外,高质量技术书籍也是研究查询优化技术必不可少的武器。本书结合PostgreSQL的查询优化器源代码,深入分析了一个查询进入PostgreSQL之后一步步被查询优化器转换成一个可执行的、优化后的执行计划的全过程。为了让读者更容易理解,本书还配备了大量的实例来讲解,确实是一部值得一读的好书。
身为一名PostgreSQL爱好者和数据库研究人员,我感到无比幸福和自豪—据我有限的知识,全球仅有几本分析PostgreSQL内核的书籍,而它们全都出自中国作者之手。希望今后有更多、更好的此类书籍面世,也祝愿中国的数据库技术和产品有朝一日能够走向世界。
彭煜玮
2018.4.25于珞珈山
序二
中国有句古话,“巧妇难为无米之炊”,说的是再好的主妇,在没有给任何食材的情况下也做不出可口的饭菜。反过来,什么样的主妇算得上“巧妇”呢?如果给你准备好了烹调所需的所有食材,你能做出可口的饭菜吗?
数据库是一个比较神奇的软件,我们都知道可以用SQL和数据库沟通,让数据库处理SQL和让主妇做饭是一样的道理,数据库能不能及时响应SQL请求,能不能用*的计划完成SQL请求,取决于数据库本身提供了哪些“料”,以及数据库打算怎么“烹调”用户提交的SQL。例如,一个简单查询SQL,数据库的扫描方法(我暂且把它称为数据库的“料”之一)就有全表扫描、索引扫描、位图扫描、跳跃扫描等。一个SQL中包括了多个函数、表达式时,数据库先处理哪个表达式或函数,又或者在什么时候处理这些表达式或函数呢?数据库“烹调”一条SQL时,如何“烹调”,如何分解,是靠什么来做决定的?在数据库决定了怎么做之后,又是如何按部就班地执行的?如果说数据库的“扫描方法、表达式、操作符、UDF、索引接口”等是数据库的“料”,那么数据库的优化器就是“巧妇”之手,它包括了“JOIN算法、SQL重写规则、多表JOIN的遗传算法、动态路径规划、选择性算法、各种NODE的成本计算算法、成本因子、并行计算成本算法”等方方面面,为数据库如何执行SQL提供了全套流程。
PostgreSQL作为一个非常经典的ORDBMS,包含了很多“料”,同时有着非常先进的优化器,为高效地执行SQL提供了良好的基础。
本书作者长期致力于数据库内核的研发,有非常丰富的理论与实践经验,本书以PostgreSQL为背景,详细介绍了PostgreSQL查询优化器中的核心概念,从“查询树、SQL重写、UNION 优化、逻辑分解”到“下推、JOIN、选择性、统计信息、扫描路径、动态规划、遗传算法”等方方面面,实为作者呕心沥血之作,同时也是数据库工作者,特别是PGer之福。
本书是不可多得的教科书级PostgreSQL内核读物,同时不乏实战性。建议想了解数据库优化器工作原理的读者及PostgreSQL爱好者深入学习。
感谢作者为PostgreSQL生态的辛勤付出,期待本书大卖。
PGer,Digoal
书摘
查询可以说是数据库管理系统中最关键、最吸引人的功能之一,每一个生产数据库系统每天都需要处理大量的各类查询,为了让这些查询运行得更快、更好,数据库管理系统的查询优化器中包含了大量的优化技术,这些优化技术是很多研究者和技术人员数十年钻研和探索总结出来的精华。不论是数据库管理系统的开发者还是数据库应用的开发者,学习理解查询优化技术都大有裨益。
作为最先进的开源对象关系型数据库管理系统,PostgreSQL及其源代码无疑是学习和体会查询优化技术的最佳平台。除此之外,高质量技术书籍也是研究查询优化技术必不可少的武器。本书结合PostgreSQL的查询优化器源代码,深入分析了一个查询进入PostgreSQL之后一步步被查询优化器转换成一个可执行的、优化后的执行计划的全过程。为了让读者更容易理解,本书还配备了大量的实例来讲解,确实是一部值得一读的好书。
身为一名PostgreSQL爱好者和数据库研究人员,我感到无比幸福和自豪—据我有限的知识,全球仅有几本分析PostgreSQL内核的书籍,而它们全都出自中国作者之手。希望今后有更多、更好的此类书籍面世,也祝愿中国的数据库技术和产品有朝一日能够走向世界。
彭煜玮
2018.4.25于珞珈山
序二
中国有句古话,“巧妇难为无米之炊”,说的是再好的主妇,在没有给任何食材的情况下也做不出可口的饭菜。反过来,什么样的主妇算得上“巧妇”呢?如果给你准备好了烹调所需的所有食材,你能做出可口的饭菜吗?
数据库是一个比较神奇的软件,我们都知道可以用SQL和数据库沟通,让数据库处理SQL和让主妇做饭是一样的道理,数据库能不能及时响应SQL请求,能不能用最优的计划完成SQL请求,取决于数据库本身提供了哪些“料”,以及数据库打算怎么“烹调”用户提交的SQL。例如,一个简单查询SQL,数据库的扫描方法(我暂且把它称为数据库的“料”之一)就有全表扫描、索引扫描、位图扫描、跳跃扫描等。一个SQL中包括了多个函数、表达式时,数据库先处理哪个表达式或函数,又或者在什么时候处理这些表达式或函数呢?数据库“烹调”一条SQL时,如何“烹调”,如何分解,是靠什么来做决定的?在数据库决定了怎么做之后,又是如何按部就班地执行的?如果说数据库的“扫描方法、表达式、操作符、UDF、索引接口”等是数据库的“料”,那么数据库的优化器就是“巧妇”之手,它包括了“JOIN算法、SQL重写规则、多表JOIN的遗传算法、动态路径规划、选择性算法、各种NODE的成本计算算法、成本因子、并行计算成本算法”等方方面面,为数据库如何执行SQL提供了全套流程。
PostgreSQL作为一个非常经典的ORDBMS,包含了很多“料”,同时有着非常先进的优化器,为高效地执行SQL提供了良好的基础。
本书作者长期致力于数据库内核的研发,有非常丰富的理论与实践经验,本书以PostgreSQL为背景,详细介绍了PostgreSQL查询优化器中的核心概念,从“查询树、SQL重写、UNION 优化、逻辑分解”到“下推、JOIN、选择性、统计信息、扫描路径、动态规划、遗传算法”等方方面面,实为作者呕心沥血之作,同时也是数据库工作者,特别是PGer之福。
本书是不可多得的教科书级PostgreSQL内核读物,同时不乏实战性。建议想了解数据库优化器工作原理的读者及PostgreSQL爱好者深入学习。
感谢作者为PostgreSQL生态的辛勤付出,期待本书大卖。
PGer,Digoal