具体描述
查询优化器是数据库中很重要的模块之一,只有掌握好查询优化的方法且了解查询优化的细节,在对数据库调优的过程中才能有的放矢,否则调优的过程就如无本之木、无源之水,虽上下求索而不得其法。
《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
2.9 查询树的遍历 31
2.10 执行计划的展示 32
2.11 小结 33
第3章 逻辑重写优化 34
3.1 通用表达式 35
3.2 子查询提升 36
3.2.1 提升子连接 37
3.2.2 提升子查询 51
3.3 UNION ALL优化 68
3.4 展开继承表 69
3.5 预处理表达式 71
3.5.1 连接Var的溯源 71
3.5.2 常量化简 72
3.5.3 谓词规范 73
3.5.4 子连接处理 79
3.6 处理HAVING子句 80
3.7 Group By键值消除 81
3.8 外连接消除 82
3.9 grouping_planner的说明 91
3.10 小结 92
第4章 逻辑分解优化 93
4.1 创建RelOptInfo 94
4.1.1 RelOptInfo结构体 94
4.1.2 IndexOptInfo结构体 97
4.1.3 创建RelOptInfo 100
4.2 初识等价类 102
4.3 谓词下推 106
4.3.1 连接条件的下推 106
4.3.2 过滤条件的下推 112
4.3.3 连接顺序 113
4.3.4 deconstruct_recurse函数 118
4.3.5 make_outerjoininfo函数 124
4.3.6 distribute_qual_to_rels函数 132
4.3.7 reconsider_outer_join_clauses函数 151
4.3.8 generate_base_implied_equalities函数 156
4.3.9 记录表之间的等价关系 157
4.4 PlaceHolderVar的作用 158
4.5 Lateral语法的支持 161
4.5.1 Lateral的语义分析 162
4.5.2 收集Lateral变量 164
4.5.3 收集Lateral信息 164
4.6 消除无用连接项 166
4.7 Semi Join消除 171
4.8 提取新的约束条件 172
4.8.1 提取需要满足的条件 173
4.8.2 提取流程 174
4.8.3 选择率修正 176
4.9 小结 177
第5章 统计信息和选择率 178
5.1 统计信息 178
5.1.1 PG_STATISTIC系统表 181
5.1.2 PG_STATISTIC_EXT系统表 185
5.1.3 单列统计信息生成 187
5.1.4 多列统计信息生成 196
5.2 选择率 200
5.2.1 使用函数依赖计算选择率 204
5.2.2 子约束条件的选择率 208
5.2.3 基于范围的约束条件的选择率修正 211
5.3 OpExpr的选择率 213
5.3.1 eqsel函数 215
5.3.2 scalargtsel函数 217
5.3.3 eqjoinsel函数 220
5.4 小结 226
第6章 扫描路径 227
6.1 代价(Cost) 228
6.1.1 代价基准单位 228
6.1.2 启动代价和整体代价 231
6.1.3 表达式代价的计算 233
6.2 路径(Path) 236
6.2.1 Path结构体 236
6.2.2 并行参数 237
6.2.3 参数化路径 239
6.2.4 PathKey 242
6.3 make_one_rel函数 244
6.4 普通表的扫描路径 245
6.4.1 顺序扫描 246
6.4.2 索引扫描 248
6.4.3 位图扫描 281
6.5 小结 291
第7章 动态规划和遗传算法 292
7.1 动态规划 293
7.1.1 make_rel_from_joinlist函数 297
7.1.2 standard_join_search函数 298
7.1.3 join_search_one_level函数 298
7.2 遗传算法 301
7.2.1 种群初始化 303
7.2.2 选择算子 308
7.2.3 交叉算子 310
7.2.4 适应度计算 311
7.3 小结 312
第8章 连接路径 313
8.1 检查 314
8.1.1 初步检查 314
8.1.2 精确检查 316
8.1.3 “合法”连接 318
8.2 生成新的RelOptInfo 324
8.3 虚表 327
8.4 Semi Join和唯一化路径 328
8.5 建立连接路径 331
8.5.1 sort_inner_and_outer函数 334
8.5.2 match_unsorted_outer函数 345
8.5.3 hash_inner_and_outer函数 350
8.6 路径的筛选 355
8.7 小结 360
第9章 Non-SPJ优化 361
9.1 集合操作处理 361
9.2 Non-SPJ路径 367
9.2.1 Non-SPJ预处理 368
9.2.2 Non-SPJ路径生成 376
9.3 小结 382
第10章 生成执行计划 383
10.1 转换流程 383
10.1.1 扫描计划 384
10.1.2 连接计划 390
10.2 执行计划树清理 391
10.3 小结 395
· · · · · · (收起)
读后感
用户评价
当我翻开《PostgreSQL技术内幕:查询优化深度探索》这本书,我感觉自己像是进入了一个精密运作的机械迷宫。它没有将查询优化简化为几条“速成”的技巧,而是深入到 PostgreSQL 的核心,为你展示了它如何一步步地构建、评估和执行查询。书中对各种查询操作符(如 Seq Scan, Index Scan, Hash Join, Merge Join 等)的详细解释,以及它们之间的权衡,让我对 PostgreSQL 的执行引擎有了前所未有的清晰认识。我特别喜欢它关于统计信息重要性的阐述,这让我明白了为什么 PostgreSQL 在某些情况下会做出“看似错误”的决策,以及如何通过收集更准确的统计信息来纠正这些问题。而且,书中还涉及了一些关于并行查询和查询重写的内容,这些都是在处理大数据量和复杂查询场景时至关重要的技术。对于我而言,这本书不仅仅是一本技术手册,更像是一次关于 PostgreSQL 内部机制的“深度游学”。它让我能够更自信地面对各种性能挑战,并找到最有效的解决方案。
这本书简直是数据库爱好者的福音!拿到手的第一感觉就是厚重,翻开目录更是心潮澎湃。我一直觉得 PostgreSQL 是一座深邃的宝藏,而这本书就像一把金钥匙,为我开启了它的秘密宝库。它并非那种浅尝辄止的入门指南,而是直指核心,深入剖析了 PostgreSQL 查询优化的方方面面。光看标题“查询优化深度探索”就足以让人肾上腺素飙升,而内容更是没有辜负这份期待。书中对各种查询计划的解读,细致入微,简直就像一位经验丰富的医生在为你诊断病灶,精准找出性能瓶颈所在。从最基础的索引类型,到复杂的 Join 策略,再到统计信息的重要性,无一不涵盖。我尤其喜欢它对几种常见查询模式的优化案例分析,那些图文并茂的解释,让我茅塞顿开,之前那些困扰我的性能问题,似乎都找到了根源。更别提那些关于 CBO(Cost-Based Optimizer)内部工作原理的讲解,简直是为我量身定做的“武林秘籍”,让我对 PostgreSQL 的优化决策过程有了前所未有的清晰认识。对于长期与 PostgreSQL 打交道的开发者、DBA 来说,这本书的价值无可估量,它不仅能提升你解决实际问题的能力,更能让你在设计和维护数据库时,拥有更高的“战略眼光”。看完这本书,我感觉自己对 PostgreSQL 的理解上升到了一个全新的维度,不再是停留在表面,而是能够深入骨髓,洞察其运行的内在逻辑。
当我拿起《PostgreSQL技术内幕:查询优化深度探索》这本书时,我立刻就被它严谨而深入的内容所吸引。它不仅仅是教你如何写出“快”的 SQL,更是让你理解“为什么”会快。书中对 PostgreSQL 执行引擎内部运作机制的剖析,让我大开眼界。我之前对索引的理解仅限于“能加速查找”,但这本书让我明白了不同索引类型(B-tree, GIN, GiST 等)的底层实现原理、适用场景以及它们的性能权衡。更让我受益匪浅的是,书中对复杂 JOIN 操作的优化策略进行了详尽的阐述,例如 Hash Join, Merge Join, Nested Loop Join 的选择依据,以及它们在不同数据分布下的表现。这些都是在实际工作中经常遇到的瓶颈,而这本书提供了清晰的指导。此外,书中还对 PostgreSQL 的查询重写、视图展开、以及内置函数对查询性能的影响进行了深入的探讨。它鼓励读者去思考,去实验,去找到最适合自己业务场景的优化方案。对于我这样的 PostgreSQL 用户来说,这本书无疑是一次“醍醐灌顶”的体验。它让我从一个“使用者”进化成了一个能够“理解者”,甚至可以说是“优化者”。
拿到《PostgreSQL技术内幕:查询优化深度探索》这本书,我首先感受到的是它传递出的“深度”和“专业”。它不是那种为了填充篇幅而泛泛而谈的书籍,而是真正聚焦于 PostgreSQL 查询优化的核心技术。我一直觉得,要真正掌握一个数据库,就必须了解它的“心脏”是如何跳动的,而这本书无疑就是为我们揭示 PostgreSQL 查询优化器这个“心脏”的秘密。书中对各种执行计划的细致解读,让我能够像解剖一样,一层层地分析查询的执行过程,找出性能的“蛛丝马迹”。我特别欣赏其中关于统计信息对查询优化影响的深入探讨,这让我明白,准确且及时的统计信息是 PostgreSQL 做出最优决策的基础。同时,书中对各种 JOIN 策略的分析,以及在不同场景下的最优选择,也为我提供了宝贵的实践指导。让我惊喜的是,这本书还涉及了一些较为底层的优化技术,例如谓词下推、表达式求值优化等,这些细节往往是性能提升的关键,却常常被忽略。这本书,对于任何一个想要从根本上理解并优化 PostgreSQL 查询的用户来说,都是一本不可或缺的“圣经”。
当我捧起《PostgreSQL技术内幕:查询优化深度探索》这本书时,我并没有预想到它会给我带来如此深刻的震撼。它不像市面上许多同类书籍那样,仅仅停留在“技巧”层面,而是真正深入到了 PostgreSQL 查询优化的“骨髓”之中。书中对 PostgreSQL 执行引擎内部运作机制的精辟阐述,让我对数据库的执行过程有了前所未有的洞察力。我一直对 PostgreSQL 的各种索引类型感到好奇,而这本书则从根本上解释了 B-tree, GIN, GiST 等索引的工作原理,以及它们在不同查询场景下的性能表现。更让我惊喜的是,书中对复杂 JOIN 操作的深度剖析,包括 Hash Join, Merge Join, Nested Loop Join 的选择依据和性能权衡,为我提供了处理复杂查询场景的宝贵经验。我尤其喜欢书中对统计信息重要性的强调,这让我明白了为什么 PostgreSQL 的优化器有时会做出“出乎意料”的选择,以及如何通过优化统计信息来引导它做出更优的决策。对于每一个渴望提升 PostgreSQL 查询性能,并希望从根本上理解其工作原理的读者来说,这本书无疑是一次“脱胎换骨”的知识升级。
《PostgreSQL技术内幕:查询优化深度探索》这本书,就像是一本为 PostgreSQL“诊断疑难杂症”的医典。我一直觉得,要成为一名优秀的数据库工程师,不仅要会写 SQL,更要懂 SQL 的“执行原理”。这本书恰恰满足了我的这个需求。它没有回避 PostgreSQL 查询优化中那些复杂而深奥的细节,而是迎难而上,层层剥茧。我特别欣赏其中对各种执行计划节点(如 Filter, Project, Sort, GroupAggregate 等)的详细解释,以及它们在整个执行过程中的作用。这让我能够更准确地理解为什么一个查询会产生特定的执行计划,以及哪些节点是性能的“罪魁祸首”。书中还深入探讨了 PostgreSQL 的 CBO(Cost-Based Optimizer)是如何工作的,包括代价模型、参数调优以及如何影响优化决策。这为我提供了非常有价值的指导,让我能够更有效地对 PostgreSQL 的查询计划进行干预和优化。对于那些希望深入理解 PostgreSQL 性能,并掌握高级优化技巧的读者来说,这本书绝对是一本“必读之书”。
坦白说,一开始我拿到《PostgreSQL技术内幕:查询优化深度探索》时,对它的期望并没有那么高,毕竟“查询优化”这个话题听起来就有些枯燥,而且市面上关于 PostgreSQL 的书籍也层出不穷。然而,这本书却给了我一个巨大的惊喜。它以一种非常引人入胜的方式,将复杂的查询优化原理娓娓道来。我一直以为 PostgreSQL 的优化器是个神秘莫测的存在,但读完这本书,我感觉自己已经掌握了它的“脉搏”。书中对 CBO(Cost-Based Optimizer)的工作流程,参数的含义,以及如何影响优化决策的讲解,简直是庖丁解牛,让我清晰地看到了 PostgreSQL 是如何根据统计信息来选择最佳执行计划的。而且,这本书的内容非常实在,没有丝毫的“水分”。从基础的谓词下推、表达式求值,到更高级的并行查询、物化视图的优化,几乎涵盖了查询优化的所有重要方面。让我印象深刻的是,书中对每一种优化手段都进行了详细的解释,并给出了相应的示例,让我们能够亲身体验其效果。对于那些想要深入理解 PostgreSQL 性能的用户来说,这本书绝对是一本不可多得的“葵花宝典”。它能够帮助你拨开迷雾,找到影响查询性能的真正原因,并给出切实有效的解决方案。
《PostgreSQL技术内幕:查询优化深度探索》这本书,就像一位经验丰富的老者,娓娓道来 PostgreSQL 查询优化这门深奥的艺术。它没有华丽的辞藻,只有扎实的干货。从我个人的角度出发,这本书最大的价值在于它将抽象的优化概念,通过生动形象的例子和清晰的逻辑,变得触手可及。我一直以来对 PostgreSQL 的索引策略有一些模糊的认识,但这本书让我对 B-tree、GIN、GiST 等不同索引类型的内部机制和最佳使用场景有了全新的理解。书中对查询执行计划的深入剖析,简直就像是在为我进行一次“深度体检”,让我能够准确地定位出查询的瓶颈所在。特别是它对 CBO(Cost-Based Optimizer)的解读,让我不再盲目地猜测 PostgreSQL 的决策过程,而是能够理解其背后的逻辑和考量。让我印象深刻的是,书中对一些常见的性能问题,如 N+1 问题、大量数据聚合等,提供了非常具体且有效的优化建议。对于那些希望在 PostgreSQL 领域有所建树,并追求极致性能的开发者和 DBA 来说,这本书绝对是一笔宝贵的财富。
当我拿到这本《PostgreSQL技术内幕:查询优化深度探索》时,内心是充满好奇与期待的。作为一名在数据领域摸爬滚打多年的从业者,我深知高效查询的重要性,也曾无数次被性能问题折磨得焦头烂额。这本书如同一盏明灯,照亮了我通往 PostgreSQL 查询优化之路。它并非泛泛而谈,而是从最底层、最核心的机制出发,层层递进地揭示了 PostgreSQL 如何处理和优化查询。书中对各种执行计划的深入剖析,简直就像是将“黑箱”打开,让我们得以一窥究竟。我特别欣赏其中对各种扫描方法的细致比较,例如顺序扫描、索引扫描、位图堆扫描的适用场景和性能表现,都解释得非常透彻。书中还详细讲解了 PostgreSQL 的查询重写规则和常量折叠等预处理阶段,这些细节往往是性能提升的关键,却常常被忽视。更让我惊喜的是,它并没有止步于理论,而是提供了大量的实际案例,通过具体的 SQL 语句和对应的执行计划,一步步引导读者理解优化过程。这些案例涵盖了从简单到复杂的各种场景,让我们可以将学到的知识立即应用到自己的工作中。对于那些渴望提升 PostgreSQL 查询性能,但又不知从何下手的读者,这本书无疑是一份宝贵的财富。它让你明白,优化不仅仅是修改 SQL 语句,更需要理解数据库的内部工作原理。
对于任何一个在 PostgreSQL 的世界里深耕的技术人员来说,《PostgreSQL技术内幕:查询优化深度探索》这本书绝对是一次知识的洗礼。它不是那种翻几页就能概括完的“速成”读物,而是需要你静下心来,细细品味,才能领悟其精髓。书中对于 PostgreSQL 查询优化器的内部机理的阐述,简直是教科书级别的。我一直对 PostgreSQL 的 CBO(Cost-Based Optimizer)感到好奇,这本书则毫不保留地揭示了它的工作方式,包括统计信息的收集、代价估算、以及多种执行计划的生成和选择过程。这让我能够更精准地理解为什么 PostgreSQL 会生成特定的执行计划,以及在什么情况下可以对其进行干预。我特别喜欢书中对各种优化技巧的讲解,比如如何利用 CTE(Common Table Expressions)进行逻辑重组,如何有效地使用窗口函数,以及如何针对性地创建索引来满足特定的查询需求。书中提供的案例分析,非常贴合实际工作中的痛点,让我能够将学到的理论知识迅速转化为解决问题的能力。这本书的价值,在于它不仅仅提供了“做什么”,更重要的是教你“怎么做”以及“为什么这么做”。
我是优化器小白, 通过本书可以算带我入门, 另外pg代码注释非常详细, 看书看注释看代码...
我是优化器小白, 通过本书可以算带我入门, 另外pg代码注释非常详细, 看书看注释看代码...
模块分明,层次清晰,可见作者对PG的理解相当深刻,并非肤浅的代码注释; 另一方面也说明PG的代码实现实在XX,需要这么多代码剖析文章才能理清逻辑
看了一些里面摘录的文章,感觉不错, 至少比什么pg修炼之道好得多
我是优化器小白, 通过本书可以算带我入门, 另外pg代码注释非常详细, 看书看注释看代码...