前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL 代价模型

PostgreSQL 代价模型

作者头像
AustinDatabases
发布2019-06-21 16:42:56
1.2K0
发布2019-06-21 16:42:56
举报
文章被收录于专栏:AustinDatabases
作为目前可以替代oracle的主力数据库,了解POSTGRESQL 的代价模型,有利于在分析SQL 语句和 优化SQL 语句时明白可能存在的问题根源和解决方法。

对于ORACLE ,SQL SERVER 这样的数据库的代价模型一般是不会透露给外部的,所以我们看到一些COST 也是一头雾水,摸不清头脑。

PostgreSQL 在代价模型上是开放的,有利于运维以及开发人员理解性能较差的查询发生在哪里。

首先我们先分析一下可能存在的 cost 的点在哪里, 以下是一个计划树的大致顺序和名称

1 Seq Scan

2 sort

3 Materialize

4 index scan

5 Merge left join

6 group aggregate

7 hashaggregate

设计POSTGRESQL 的 cost model

1 Seq_page_cost = Cs

2 random_page_cost = Cr

3 cpu_tuple_cost = Ct

4 cpu_index_tuple_cost = Ci

5 cpu_operator_cost = Co

6 number of disk pages fetched sequentially = Ns

7 number of disk pages fetched randomly

8 number of tuples proessed

9 number of index entries processed during an index scan

10 number of operations performed

一个总体的 cost 大致由

C = Ns * Cs + Nr * Cr + Nt * Ct + Ni* Ci + No*Co

同时我们需要知道 cost parameters 的 参数的默认值

cs 1.00

cr 4.00

ct 1.00e-2

ci 5.00e-3

co 2.50e-3

大体上我们可以知道一个 COST 的计算是通过 查询的所需的步骤, 步骤的复杂度,CPU 和 I/O 并行度, 锁查询的记录的relation_size 等等组成, 通过这样的计算,多钟查询的方式,最终的值比较,得出那个是好的查询 ,那个就被废弃了。

下面我们做一个简单的分析,下面是每一个方式的默认的消耗值

我们来尝试计算下一个查询的 cost ,大家看下面的图

估计会有两个疑问,1770 从哪里来的, 为什么是 3600000

1 1770 是通过整体数据,来计算出来的tuple 数据元, 另一个3600000 是table's 记录数的行数。

大家可以看到计算出的数字就是 Query plan 的数字。

一般来说简单的cost 通过人工来计算还是比较简单的,但是如果复杂的例如并行,索引,等等就比较麻烦了。人工算起来会比价麻烦

同时还有一点,在计算I/O的 costing 的时候,需要注意,如果在使用索引的情况下 随机读 random_page_cost默认值是 4 ,但如果你的磁盘是 SSD的情况下,则随机读和顺序读的差距会很小,被忽略,所以 random_page_cost 的值是可以设置为1 的,这点是需要注意的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档