PostgreSQL查询优化(一)概述


本系列主要参考<PostgreSQL技术内幕:查询优化深度探索>
PostgreSQL的官方 源代码地址,git地址是git://git.postgresql.org/git/postgresql.git
Github上的 镜像

查询优化

查询树
查询执行计划
语法分析模块
执行分析模块
执行器模块

可以看出它的输入是查询树,输出是执行计划

查询优化器相对于数据库用户的优势

  • 优化方案设计复杂,超出人脑
  • 优化器有着用户不知道的统计信息
  • 数据库数据变化,原优化方案不适用

优化的两个层次

  • Rule Based Optimization
    重写
    分解
  • Cost Based Optimization

关系模型

这里是一些讲数据库的书都会共同讲到的基础知识,包括关系代数和谓词演算。这里把里面的符号备忘以下

符号含义来源
σ \sigma σ选择关系代数
Π \Pi Π投影关系代数
× \times ×笛卡儿积集合论
÷ \div ÷除法
∪ \cup 并集集合论
− − 集合论
∩ \cap 交集
⋈ \Join 连接
⟕ ⟕ 左外连接
⟖ ⟖ 右外连接
⟗ ⟗ 全外连接
⋉ ⋊ ⋉ ⋊ 半连接
⊳ \rhd 反半连接
θ θ θθ连接
ρ ρ ρ改名
← ← 赋值
γ \gamma γ分组

对于关系代数的优化主要是将选择映射进行下推

物理优化

B+树

B树是一个每级有[m/2,m]的节点的树
B+树在B树的基础上添加了下一节点指针页内最大地址

hash表

排序

物理连接的MergeJoin也需要排序

物化

物化也可以看作是缓存,方便中间结果多次使用

物理路径

物理路径分为扫描路径连接路径,前者针对单个关系,处理选择投影,后者针对多个表,处理笛卡尔积,一般扫描路径是叶节点,是为连接路径做准备的

扫描路径

  • 顺序扫描
  • 索引扫描
    会带来随机读的问题,一般配合位图使用
  • 快速索引扫描
    如果只根据索引就能得到想要的数据

连接路径

  • Nestlooped Join
    • 一般情况下复杂度是 O ( m ∗ n ) O(m*n) O(mn)
    • 内表路径是索引扫描路径时复杂度是 O ( log ⁡ n ) O(\log n) O(logn)
    • 内表是一个索引扫描时复杂度 O ( m log ⁡ n ) O(m\log n) O(mlogn)
  • 内表比较小时可以先hash,这时复杂度是 O ( m ∗ n / N ) O(m*n/N) O(mn/N)
  • 也可以两个表都排序做Merge Join

物理连接的选择

  • 自下而上的动态规划
  • 自上而下先逻辑查询树再枚举各种物理可能
  • 随机搜索,例如遗传算法
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值