PostgreSQL——代价估计
2021SC@SDUSC
目录
- 概述
- 代价估算公式
- 选择度
- 单个表的扫描代价
- 两个表的连接代价
- 总结
概述
我负责的PostgreSQL代码部分:查询的编译与执行
此篇博客的分析内容:代价估计 在前几篇博客中,我介绍了查询优化的一些步骤和相关函数。在PostgreSQL的查询优化过程中,查询请求的不同执行方案是通过建立不同的路径(Path)来表达的。在生成了许多符合条件的路径之后,要从中选择出代价最小的路径,把它转化为一个计划,传递给执行器执行。因此,优化器的核心工作是建立多条路径,然后从中找出最优的那一条。同一个查询请求有不同路径主要是因为:表的不同访问方式,表之间不同的连接方式,表之间不同的连接顺序等因素造成的。而评价路径优劣的依据是用系统表pg_statistic中的系统统计信息估计出的不同路径的代价(Cost)
某个路径的代价要考虑CPU代价和磁盘存取代价两方面。磁盘代价以从磁盘顺序存取一个页面的代价为单位,所有其他形式的代价计算都是相对磁盘存取代价来计算的。对于估算代价的参数有:
估算代价的参数 | 详细 |
---|---|
seq_page_cost | 顺序存取页的代价,值为1.0 |
random_page_cost | 非顺序存取页的代价,值为4.0 |
cpu_tuple_cost | 典型的CPU处理一个元组的代价,值为0.01 |
cpu_index_tuple_cost | 典型的CPU处理一个索引元组的代价,值为0.005 |
cpu_operator_cost | CPU处理一个典型的WHERE操作的代价,值为0.0025 |
effective_cache_size | 用来量度PostgreSQL和OS 缓存的磁盘页的数量,值为16384 |
一个路径的代价由三部分组成:启动代价(Startup Cost),总代价(Toal Cost),执行结果的排序方式(PathKeys)计算启动和总代价所用的参数如下:
(1)基本参数:
表元组数ntuples
表磁盘块数nblocks
符合选择条件的元组数nrows
(2)统计信息:
查询规划器需要估计一个查询检索的元组的数目,这样才能选择正确的查询规划,统计信息的主要内容就是每个表和索引中的元组总数,以及每个表和索引占据的磁盘块数。这个信息保存在系统表pg_class的reltuples和relpages属性中
(3)直方图信息(存储在系统表中):各个属性值出现次数的统计信息
路径的代价估算的基本步骤都是相似的:首先根据统计信息和查询条件,估算出这次查询要进行的I/O次数以及要取出的元组个数,然后根据元组个数(分为表元组和索引元组)计算出CPU的代价,最后综合考虑CPU代价和I/O次数(磁盘代价)即可得到最后的代价。不同的路径类型有不同的代价估算方式。
代价估算公式
代价估算从I/O次数和 CPU 开销两个方面考虑,估算公式为P+W*T。其中,P表示在执行时所要访问的页面数,反映了磁盘I/O次数;工表示在执行时所要访问的元组数,反映了 CPU 开销;W 表示磁盘I/O代价和 CPU 开销间的权重因子。通过对估算公式的分析可以发现,计算代价时只需考虑访问的页面数和元组数。
选择度
选择度(selectivity)用来定量地描述前述代价估算公式中的权重因子W。选择度的计算要综合考虑以下各类参数:约束条件中的操作符、约束常量、索引中的元组数、某字段的最大值和最小
值等。下面列出了对于选择度计算需要考虑的因素。
约束条件 | 选择度 |
---|---|
r. field = value | 1/字段r.field 上所定义的索引关系的元组数 |
r. field > value | (字段r.field 的最大值-value)1(字段r.field 的最大值一字段r.field的最小值) |
r. field < value | (value-字段rfield 的最小值)1(字段r.field 的最大值一字段r.field的最小值) |
单个表的扫描代价
计算单个表的扫描代价时,需要将表的大小与各个约束条件所对应的选择度相乘,如下图所示。
扫描方式 | P | T |
---|---|---|
顺序扫描 | NumPages | NumTuples |
一级索引扫描 | NumPages * F | NumTuples * F |
二级索引扫描 | NumPages * F + ITuples * F | ITuples * F + NumTuples * F |
其中,NumPages 表示表的页面数;NumTuples 表示表的元组数;ITuples 表示索引表的元组数;F表示多个约束条件组合后的选择度。
两个表的连接代价
两个表的连接代价计算方法如下图所示:
连接方式 | 代价计算公式 |
---|---|
嵌套循环连接 | Couter + Nouter * Cinner |
归并连接 | Couter+ Csortouter + Cinner + Csortinner |
Hash 连接 | Couter+ Ccreatehash + Nouler * Chash |
其中:
Couter 表示扫描外连接表的代价。
Cinner 表示扫描内连接表的代价。
Csortouter 表示将外连接表进行排序的代价(使用临时存储空间)。
Csortinner:表示内连接表进行排序的代
价(使用临时存储空间)。
Ccreatehash 表示对内连接表进行 Hash 的
代价(使用临时存储空间)。
Chash 表示单独的Hash 的代价。
Nouter 表示外连接表的大小。
总结
通过本篇博客,了解了代价估计的方法和涉及的参数,感谢批评指正!
PostgreSQL——代价估计相关推荐
- PostgreSQL服务器管理:服务器配置
https://www.sypopo.com/post/715XYNwNoY/ PostgreSQL服务器管理:服务器配置 本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. ...
- PostgreSQL服务器参数配置
服务器配置 1 设置参数 1.1 参数名称和值 所有参数名都是大小写不敏感的.每个参数都可以接受五种类型之一的值: 布尔.字符串.整数. 浮点数或枚举. 布尔: 值可以被写成 on, off, tru ...
- postgresql性能优化
版本:PostgreSQL 11.4 1. postgresql参数调优 序号 参数名称 默认值 优化值 参数说明 1 listen_addresses localhost * 默认只有本地访问,开启 ...
- PostgreSQL 数据库性能
1:数据库性能常用的度量指标 (1)运行时间 run time (2)QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个 ...
- delphi 数据 上移 下移_脑图-数据库查询优化器的艺术
这次阅读了<数据库查询优化器的艺术:原理解析与SQL性能优化>这本书,主要介绍数据库的查询优化,但是感觉这本书重复内容较多,在通过源码介绍PostgreSQL和MySQL的章节中,相对来说 ...
- 行存储和列存储小介绍
.定义 1.1定义 Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析.数据挖掘等查询密集型应用.列存储,缩写为DSM,相对于NSM(N-ary storage ...
- pgsql执行分析explain结果分析
EXPLAIN 的输出结构 阅读到这里,我们已经知道了如何使用EXPLAIN 命令.接下来,我们将学习如何理解EXPLAIN 的输出,从而快速地定位问题. 以下面的输出为例(该例子选自PostgreS ...
- 一种将 Tree-LSTM 的强化学习用于连接顺序选择的方法
[导读] 本篇博客讲解的是 2020 年由清华大学李国良教授团队发表在 ICDE 上的论文,介绍它所提出的算法与实验结果,并结合实际情况给出一些思考. 原文链接: http://dbgroup.cs. ...
- mysql cbo_SparkSQL2.4中启用CBO时JoinReorder分析
背景 Spark Join方式 SparkSQL目前支持三种join方式broadcast hash join:将小表广播分发到大表所在的结点上 ,并行在各节点上进行hash join仅适合内表非常小 ...
最新文章
- C++知识点3——const基础
- zznu 1996 : 正三角形和圆的爱情
- 如何在Debian 9 / Debian 8上安装MariaDB 10.3
- 分形——数学与艺术结合的明珠
- 冰点密码忘记了怎么办
- js 作为属性的变量
- 微信服务号获取地理位置
- 设置android模拟器的ip地址,设置Android模拟器IP地址
- 微信开发工具怎么模拟android环境,uni-app判断客户端环境是 安卓Android、iOS 、微信开发工具...
- linux 编辑 iso文件格式,这两款实用的光盘映像文件制作编辑软件让你处理ISO文件易如反掌...
- MACD底背离选股公式——通达信、同花顺
- 其实,我对你是有一些失望的。
- Dharma暴跌过度解读了吗?去中心化不足,模式难持续是关键
- 如何控制input的输入方向
- Win11系统白名单列表如何添加软件
- 【题目】HDU P6595(C849E)Everything Is Generated In Equal Probability
- 从“人类简史”到“未来简史”:为什么 AI 会带来工作岗位的爆发?
- Linux网卡固件,CentOS下X710网卡升级驱动和固件脚本 | 聂扬帆博客
- TopoGun 3基础:重出江湖并一招封神的新功能 Patch!!!
- android:scaleType 属性介绍