《PostgreSQL技术内幕:查询优化深度探索》是一本极具价值的数据库技术书籍,它涵盖了许多关键的主题,如PostgreSQL的查询优化、源码解析和架构分析,通过深入剖析数据库的关键细节,并结合一线案例,彭煜玮、Digoal(德哥)、蚂蚁金服、JD、阿里巴巴等业内专家的力荐,读者能够获得宝贵的知识和经验,为十年数据库内核的修炼之道提供了重要的指导,无论是对于新手还是有经验的数据库工程师,这本书都是不可或缺的参考资料。
PostgreSQL技术内幕:查询优化深度探索 电子书封面
内容介绍
查询优化器是数据库中很重要的模块之一,只有掌握好查询优化的方法且了解查询优化的细节,在对数据库调优的过程中才能有的放矢,否则调优的过程就如无本之木、无源之水,虽上下求索而不得其法。
本书揭示了PostgreSQL数据库中查询优化的实现技术细节,首先对子查询提升、外连接消除、表达式预处理、谓词下推、连接顺序交换、等价类推理等逻辑优化方法进行了详细描述,然后结合统计信息、选择率、代价对扫描路径创建、路径搜索方法、连接路径建立、Non-SPJ路径建立、执行计划简化与生成等进行了深度探索,使读者对PostgreSQL数据库的查询优化器有深层次的了解。
适合数据库内核开发人员及相关领域的研究人员、数据库DBA、高等院校相关专业的本科生或者研究生阅读。
目录
- 第1章 概述 1
- 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
数据库操作 切换数据库,相当于mysql的use dbname \c dbname 列举数据库,相当于mysql的show databases \l 列举表,相当于mysql的show tables \dt 查看表结构,相当于desc tblname,show columns from tbname \d tblname \di 查看索引 创建数据库: create database [数据库名]; 删除数据库: drop database [数据库名]; *重命名一个表: alter table [表名A] rename to [表名B]; *删除一个表: drop table [表名];
近两天总结了下PostgreSQL的基本操作命令,对PostgreSQL也有了一个基本的认识。 PostgreSQL的功能还是很丰富的,有序列,支持db link,基本Oracle里有的概念它这里也有,目前来看不支持package。 风格和Oracle也类似,没有MySQL中快捷方便的show create table 这样的语句。 从我的使用习惯来说,我基本关注以下的一些方面。 查看数据库的配置 查看用户信息 查看会话连接信息 show tables的类似方法 用户的权限查看 建表语句 表空间信息 对象存储信息 查看锁的信息 查看数据库参数 显示数据库的运行状态 查看数据字典的信息 查看索引的信息 查看执行计划 查看存储过程 存储过程的调度执行 事务隔离级别