调整查询代价的数据库PostgreSQL怎么用

这篇文章将为大家详细讲解有关调整查询代价的数据库PostgreSQL怎么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

成都创新互联公司网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为成都网站制作、做网站,app软件定制开发以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。成都创新互联公司深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

大部分数据库对于查询中的Cost 评估的代价指标是不能进行变更的,假设如果我的系统从10000转的磁盘,变换为每秒能提供 1366MB/S 的SSD 查询评估的方法还是老的方法,这样对于数据库系统的查询性能有多少帮助? 

那到底PG 在这方面有什么特异功能,我们往下看,在这之前我们也需要知道PG 也是这些数据库中唯一的一个不能在语句中强制添加,并强制让他走索引

或不走索引的数据库。(pg_hint_plan可以解决这个问题)

下面就是一个查询中查看cost 的方法

调整查询代价的数据库PostgreSQL怎么用

下面我们更深入一点,从下面的两个图我看可以看出些什么,第一个图我们可以看到查询执行计划中Starup cost 是 0

调整查询代价的数据库PostgreSQL怎么用

下边这个查询的查询计划startup cost 中整体的cost 和 startup cost 是差不多的。

调整查询代价的数据库PostgreSQL怎么用

实际上 total cost 等于启动cost + 运行cost 

调整查询代价的数据库PostgreSQL怎么用

另外以第一个列子为例,顺序扫描是没有 startup cost的,仅仅有 operation cost 

调整查询代价的数据库PostgreSQL怎么用

总体的cost 是 2235 到底这个 2235 是怎么来的

调整查询代价的数据库PostgreSQL怎么用

我看一下bloom_table 的表行数和占用的PAGE 数。

通过以下公式   运行cost = (cpu 运行的cost  + 磁盘的运行cost ) * 多少行 + 顺序扫描的每页消耗 * 多少页面

(0.01 + 0.0025) * 100000  + 1.0 * 1235  =1250 +1235 = 2235 

其中 0.01  0.0025  1  分别是从上面图中的

seq_page_cost = 1.0 

cpu_tuple_cost = 0.01                  

cpu_operator_cost = 0.0025  

获得的,这也就说明一个语句的cost 是可以通过调整系统中的参数而进行变化的,其他的数据库在这方面基本上是不开放的。

下面我们在看看如果走了索引会怎么算cost  

调整查询代价的数据库PostgreSQL怎么用

走索引的cost 会包含启动成本,从读取索引的第一个tuple 开始,

开始的代价(走索引) = 取整{log(2)(走了多少索引的行) +( Hindex + 1) * 50} * CPU 运行的消耗

调整查询代价的数据库PostgreSQL怎么用

相关的消耗= 取整 (log2 100000 + (2+1)* 50)* 0.0025  = 0.42 (约等于实际是0.4175)

这里面有两个问题,1 HINDEX 到底是这么来的,这里面指的是索引的树高,其实可以通过这个公式来推出你的索引树有多高

运行的代价  (索引使用的CPU 代价 + 表使用CPU的代价) + (index_io 代价 + 表的io 代价)

在计算索引的代价中会涉及到选择率的问题,意思就是查询的谓词的频率的估计。

下面就是通过SQL 语句来给出每行的值来计算一个“采样率”的东西,也就是告诉你,这个行的值在整体的表中的占比。

调整查询代价的数据库PostgreSQL怎么用

这里由于计算比较麻烦,就不进行计算了,但这里需要注意的是

random_page_cost = 4.0 ,这个是在查询中使用索引计算 index_io_cost的一个标量,通过选择率 * index的page的数量 * random_page_cost 就可以得出索引的io cost ,而到底是走索引还是走全表扫描,执行计划会进行比对,如果走全表扫描会计算最小和最大的io cost,例如最大的 io_cost = 页面的数量 * random_page_cost 

所以调整 random_page_cost 的值会影响到底是走索引还是走全表扫描的选择性。 

下面可以举一个例子,我将配置文件中的random_page_cost 和 cpu_index_tuple_cost 进行调整,一个调小 一个调大,可以看到下图的结果,就算我有10万条记录,并且我查询的条件中的字段10万条那条都和那条不一样,并且也建立了相关的索引,最终的结果还是进行了全表扫描。

调整查询代价的数据库PostgreSQL怎么用

在将两个参数还原后,还是继续走原来的索引

调整查询代价的数据库PostgreSQL怎么用

说了这么多其实回到我开头说的问题,如果你的磁盘系统已经更改到SSD 磁盘则你的某些值是需要改变,否则可能会出现一些明明索引很好,但他选择全表扫描的情况。

关于调整查询代价的数据库PostgreSQL怎么用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


当前文章:调整查询代价的数据库PostgreSQL怎么用
文章分享:http://azwzsj.com/article/gcesej.html