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——代价估计相关推荐

  1. PostgreSQL服务器管理:服务器配置

    https://www.sypopo.com/post/715XYNwNoY/ PostgreSQL服务器管理:服务器配置 本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. ...

  2. PostgreSQL服务器参数配置

    服务器配置 1 设置参数 1.1 参数名称和值 所有参数名都是大小写不敏感的.每个参数都可以接受五种类型之一的值: 布尔.字符串.整数. 浮点数或枚举. 布尔: 值可以被写成 on, off, tru ...

  3. postgresql性能优化

    版本:PostgreSQL 11.4 1. postgresql参数调优 序号 参数名称 默认值 优化值 参数说明 1 listen_addresses localhost * 默认只有本地访问,开启 ...

  4. PostgreSQL 数据库性能

    1:数据库性能常用的度量指标 (1)运行时间 run time (2)QPS:Queries Per Second意思是"每秒查询率",是一台服务器每秒能够相应的查询次数,是对一个 ...

  5. delphi 数据 上移 下移_脑图-数据库查询优化器的艺术

    这次阅读了<数据库查询优化器的艺术:原理解析与SQL性能优化>这本书,主要介绍数据库的查询优化,但是感觉这本书重复内容较多,在通过源码介绍PostgreSQL和MySQL的章节中,相对来说 ...

  6. 行存储和列存储小介绍

    .定义 1.1定义 Sybase在2004年左右就推出了列存储的Sybase IQ数据库系统,主要用于在线分析.数据挖掘等查询密集型应用.列存储,缩写为DSM,相对于NSM(N-ary storage ...

  7. pgsql执行分析explain结果分析

    EXPLAIN 的输出结构 阅读到这里,我们已经知道了如何使用EXPLAIN 命令.接下来,我们将学习如何理解EXPLAIN 的输出,从而快速地定位问题. 以下面的输出为例(该例子选自PostgreS ...

  8. 一种将 Tree-LSTM 的强化学习用于连接顺序选择的方法

    [导读] 本篇博客讲解的是 2020 年由清华大学李国良教授团队发表在 ICDE 上的论文,介绍它所提出的算法与实验结果,并结合实际情况给出一些思考. 原文链接: http://dbgroup.cs. ...

  9. mysql cbo_SparkSQL2.4中启用CBO时JoinReorder分析

    背景 Spark Join方式 SparkSQL目前支持三种join方式broadcast hash join:将小表广播分发到大表所在的结点上 ,并行在各节点上进行hash join仅适合内表非常小 ...

最新文章

  1. C++知识点3——const基础
  2. zznu 1996 : 正三角形和圆的爱情
  3. 如何在Debian 9 / Debian 8上安装MariaDB 10.3
  4. 分形——数学与艺术结合的明珠
  5. 冰点密码忘记了怎么办
  6. js 作为属性的变量
  7. 微信服务号获取地理位置
  8. 设置android模拟器的ip地址,设置Android模拟器IP地址
  9. 微信开发工具怎么模拟android环境,uni-app判断客户端环境是 安卓Android、iOS 、微信开发工具...
  10. linux 编辑 iso文件格式,这两款实用的光盘映像文件制作编辑软件让你处理ISO文件易如反掌...
  11. MACD底背离选股公式——通达信、同花顺
  12. 其实,我对你是有一些失望的。
  13. Dharma暴跌过度解读了吗?去中心化不足,模式难持续是关键
  14. 如何控制input的输入方向
  15. Win11系统白名单列表如何添加软件
  16. 【题目】HDU P6595(C849E)Everything Is Generated In Equal Probability
  17. 从“人类简史”到“未来简史”:为什么 AI 会带来工作岗位的爆发?
  18. Linux网卡固件,CentOS下X710网卡升级驱动和固件脚本 | 聂扬帆博客
  19. TopoGun 3基础:重出江湖并一招封神的新功能 Patch!!!
  20. android:scaleType 属性介绍

热门文章

  1. Android游戏开发起步(译文)
  2. 初步使用JMeter
  3. java关于base64加密与生成签名的一种思想,base64中=的含义
  4. Found an unexpected Mach-O header code: 0x72613c21
  5. 【UE5】虚幻5 无法设置默认的游戏模式
  6. HTML CSS JS简易画板(含知识点温习)
  7. win10Mail绑定163邮箱
  8. f5 dns转发 f5命令行测试dns
  9. Ubuntu搭建DTN2仿真平台(详细过程记录)
  10. 基于矿灯的ZigBee无线预警系统