Please enable JavaScript.
Coggle requires JavaScript to display documents.
Postgres查询优化 (物理查询优化 基于代价估算 (索引 假如索引列为 ID (联合索引 (例如:index on table (a,…
Postgres查询优化
物理查询优化
基于代价估算
两表连接算法
嵌套循环连接算法(nested join)
两层嵌套循环
以元组为单位进行连接
元组从内存页面获取,
内存页面由系统通过IO操作获取
每个IO申请以块为单位尽量读取多个页面
排序归并(merge join)
为两表建立内存缓冲区数为M的M个子表
2.将每个子表排好序
3.读入每个子表的第一块到M个块中,
找出最小的进行元组匹配
4.找出次小的进行匹配,依次类推
hash连接
SHJ(Simple Hash Join)简单hash连接
GHJ(Grace Hash Join)优美
HHJ(Hybrid Hash Join)混合hash连接
缺点:
可能存在hash冲突
只适用于数据类型相同的等值连接
内表不能太大, 因为内表的hash表通常
存在内存,如果超过了申请的内存,可能
会存到临时文件
主要解决如下问题
单表扫描时,那种扫描方式最优
两表连接时,如何连接最优
多表连接时,如果有多种组合的连接顺序,
那种顺序最优
总代价
COST=P
a_page_cpu_time + W
T
cpu代价
W*T
W: 权重因子,表明IO到CPU的相关性
又称选择率
T:访问的元组数
访问元组,需要解析元组结构,消耗的是CPU
IO代价
单表扫描算法
顺序扫描 SeqScan
索引扫描 IndexScan
只读索引扫描
IndexOnlyScan
行扫描
RowIdScan
并行表扫描
并行索引扫描
组合多个索引扫描
索引
假如索引列为 ID
索引可作为条件出现在在where,having ,on
索引列示被连接的表对象的列存于连接条件中
索引存在,但不是key=常量的格式,不能使用索引
索引列 between and 走索引
max(id) or min (id) 可以走索引
索引常量传递
join a on a.id = b.id ... where a.id = 3
group by 字句不能用索引
having子句可以用索引
order by 子句可以用索引
联合索引
例如:index on table (a, b)
使用联合索引的全部索引列,可触发索引
使用联合索引的前缀列a,可触发索引
使用联合索引的后缀部分b,不会触发索引
两个索引列之间是and操作,会用索引,or操作不会用索引
多表连接算法
逻辑查询优化
基于关系代数规则,启发式规则生成执行计划