首页 > 数据库 >POSTGRESQL 怎么通过explain 来分析SQL查询性能

POSTGRESQL 怎么通过explain 来分析SQL查询性能

时间:2023-06-19 17:02:33浏览次数:43  
标签:POSTGRESQL Scan explain actor 查询 fa cost SQL id


POSTGRESQL  怎么通过explain 来分析SQL查询性能_数据库

Explain 命令是大多数数据库常用的一种展示SQL 执行计划和cost 的一种方式。在POSTGRESQL 中EXPLAIN 命令展示的信息比较详细,并且附带explain有不少的附加的命令来进行更多的展示。从命令来命令和功能来划分

POSTGRESQL  怎么通过explain 来分析SQL查询性能_索引_02

POSTGRESQL  怎么通过explain 来分析SQL查询性能_java_03

explain select a.first_name,a.last_name,a.last_update,fa.film_id from film_actor as fa right join actor as a on fa.actor_id = a.actor_id  where fa.actor_id < 6;
                                         QUERY PLAN                                         
--------------------------------------------------------------------------------------------
 Gather  (cost=10.71..42.20 rows=100 width=23)
   Workers Planned: 3
   ->  Parallel Hash Join  (cost=9.71..40.20 rows=32 width=23)
         Hash Cond: (fa.actor_id = a.actor_id)
         ->  Parallel Bitmap Heap Scan on film_actor fa  (cost=5.06..35.46 rows=32 width=4)
               Recheck Cond: (actor_id < 6)
               ->  Bitmap Index Scan on film_actor_pkey  (cost=0.00..5.03 rows=100 width=0)
                     Index Cond: (actor_id < 6)
         ->  Parallel Hash  (cost=3.18..3.18 rows=118 width=25)
               ->  Parallel Seq Scan on actor a  (cost=0.00..3.18 rows=118 width=25)
(10 rows)

查看explain 计划的方式和ORACLE 的查看方式类似, 从里到外,从下到上

POSTGRESQL  怎么通过explain 来分析SQL查询性能_java_04

查询中的顺序通过上图可以看出  

1   通过 film_actor表的条件将actor_id where 条件先进行执行, 控制参与数据查询的数据量,并且通过主键的方式获得数据,使用索引的方式是通过bitmap 的方式来进行

2   并行从film_actor 获取的数据通过并行的方式与actor表的数据进行HASH JOIN 

3   最后聚合结果

通过analyze 附加的参数实际执行整体的时间在16毫秒.  并且cost 的值最上层是总的执行计划耗费的,每个子步骤有自己的cost 的消耗说明.

POSTGRESQL  怎么通过explain 来分析SQL查询性能_mysql_05

而cost 中的前面的数值和后面的数值分别代表, 查询计划在获取第一行数据的成本和获取所有数据后的成本.

POSTGRESQL  怎么通过explain 来分析SQL查询性能_索引_06

当通过添加verbose 命令后,显示的信息更加的详细,并发work中如何进行并行工作,使用了多少CACHE 也会进行显示.

POSTGRESQL  怎么通过explain 来分析SQL查询性能_python_07

explain (analyze ,verbose,buffers) select a.first_name,a.last_name,a.last_update,fa.film_id from film_actor as fa right join actor as a on fa.actor_id = a.actor_id  where fa.actor_id < 6 order by fa.actor_id;

POSTGRESQL  怎么通过explain 来分析SQL查询性能_python_08

添加buffers  参数后,展示的计划中会添加在buffers 中命中的page 的数量.

剩下的就是对EXPLAIN 中的展示项进行理解: 如

1   Seq Scan: 针对表进行全表扫描, 这一般就需要看看是否有优化的必要了

2   Index Scan: 根据索引来进行索引扫描,通过索引扫描来进行数据的筛选

3   Index Only Scan (since PostgreSQL 9.2) :  通过索引查询并且仅仅通过索引就可以满足查询的数据需求,相关减少索引查询后的回表问题

4   Bitmap Index Scan / Bitmap Heap Scan / Recheck Cond  相对于index scan,  bitmap index scan   的有点在于, 他一次性将索引指向行的指针搜索完毕,并且在内存中生成相关的指针地图,然后在一次性的将数据根据地图获取. 性能比index  scan 要好.

5     Nested Loops : Nested Loops 是两张表之间根据之间的关联关系进行数据的fetch, 基本原理是分为驱动表和数据表, 从驱动表中取出一条数据,与数据表的逐行数据进行对比,并查找到结果进行缓存, 相当于一个双循环的结构.在数据库中这样的多表查询方式是低级的.  对于小数据量的多表之间的查询简单快速,耗费的执行计划计算的时间少.

6     HASH JOIN , 通过将表中关键字段的hash值进行计算后, 通过将计算后的值与另一张表进行散列表的计算,获得对应的数据,对于表连接来说快速查询数据是有利的.

7     Merge Join, Merge join 在商业数据库中对于表连接也是大量使用,通过对两个表的对应关系列进行排序,然后进行快速的对比,找到符合数据tuple 也是一种快速的进行表JOIN 的快速查询的方法.

8     Sort / Sort Key  通过对数据汇聚后在内存中进行排序,消耗内存较大

9     GroupAggregate : 在查询中使用GROUP BY 语句会在执行计划中出现groupaggregate 操作

10   HashAggregate  : 通过临时表来将数据进行hash 临时存储,在计算中不需要较大的内存

在进行group by 的操作中,如果GROUP BY 键有索引, 会倾向性的使用groupAggregate   而如果GROUP BY  键没有索引,则HASHAggregate在聚合中使用中会比较有利.

POSTGRESQL  怎么通过explain 来分析SQL查询性能_数据库_09

标签:POSTGRESQL,Scan,explain,actor,查询,fa,cost,SQL,id
From: https://blog.51cto.com/u_14150796/6516022

相关文章

  • POSTGRESQL 高可用 Patroni VS Repmgr 到底哪家强(1)
    在众多postgresql高可用模式中,主要的参与者有两位,PatroniVSrepmgr基于这二者的功能优点以及缺点相信大部分人都不是太明确,下面将根据两篇翻译的文字合并,来对两个高可用的程序来做一个比较,consandpros。 1 Repmgr是一款开源的基于postgres复制基础上的高可用软件,他基于2......
  • POSTGRESQL 14 功能有啥吸引人的
    好多人还在用postgresql10 ,12这些版本的时候,POSTGRESQL已经开启了POSTGRESQL14的旅程。那么到底Postgresql14有什么吸引人的,那就需要了解一下。 https://sql-info.de/postgresql/postgresql-14/articles-about-new-features-in-postgresql-14.html想详细了解了可以到这个......
  • POSTGRESQL openGaussDB 体系架构
    Today听了一下墨天轮举办的OpenGaussDB的专题的训练营,下面是此次线上的OpenGaussDB的体系结构的介绍。这里根据介绍快速总结出此次介绍中OpenGaussDB的特点:1 OpenGaussDB针对国产的硬件系统,如鲲鹏等硬件系统有特殊的支持和性能调试,真多国产的硬件系统有优势。2OpenGaussDB主......
  • POSTGRESQL 事务控制(二) 事务开启 (写着费力,看着费劲系列)
    今天接着上回书,事务如果在处理中没有子事务,则实现和控制是十分容易的,但如果有子事务的情况下,子事务通过transactionState结构体来实现,(上次已经提到了),每一个transactionState都指向父事务的结构体的指针.在继续往下说之前,我们的提到clog, 这是理解后面要提到的一些事情的......
  • QT sqlite 使用
    非常适合QT本地的数据落地,基本语法和oraclemysql有一定的差异,建议本地安装sqlite客户端,一边操作,一边开发下载页:http://www.sqlite.org/download.html1。删除数据deletefromin_store_code;2.  删除表droptablein_store_code;3。创建表 createtablein_store_co......
  • POSTGRESQL SERVERLESS 是POSTGRESQL 数据库的未来 (译)
    以下为翻译内容多年来,PostgreSQL一直备受瞩目,对于企业来说,POSTGRESQL流行是面临众多竞争后的选择。随着企业试图摆脱昂贵的传统关系型数据库管理系统(RDBMS),但仍希望坚持使用RDBMS,开源PostgreSQL是一种具有吸引力的、更经济实惠的替代方案。曾经有两个托管PostgreSQL服务(Aurora和RDS)......
  • SQL删除语句概述
    关于SQLDelete的这篇文章是关于SQLServer中关键语句,函数和操作的SQL必备系列的一部分。要从表中删除行,请使用delete关键字通过数据操作语言(即DML语句)完成。到目前为止,SQL删除操作是所有DML命令中最简单的操作。在执行delete命令时,我们不必担心从表中获取任何形式的数据,我们不必担......
  • POSTGRESQL NEON - Serverless 式的POSTGRESQL 数据库的独特技能 分支数据
    之前没有关注过SERVERLESS的数据库产品之前,我很少会关注SERVERLESS的东西,因为一直在实体机数据库类型打拼的我,从来不关心什么 云原生什么SERVERLESS,Idon'tcareaboutthat,it'snotmybusiness!!!!但是后来上云了,上的很深,没法了,开始关注什么是云原生,什么是POALRDB 最......
  • MYSQL MHA VS GTID 与 BINLOG SERVER
    勘误,昨天有一位海外friend指出昨天文中postgresql bloom中的第四步截图是并行扫描,而没有用到bloom索引,这里抱歉,经查实截图错误,下面是重新的截图,同时另一幅截图也有问题建立索引时缺少USINGbloom,感谢您。另也希望大家发现可以发现我的错误,并及时指出,让我们大家可以成长的......
  • pgsql 自动备份和恢复
    window自动备份@echooffSETPGPASSWORD=postgresSETtimestamp=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Date:~8,2%%Time:~3,2%SETbackup_dir=D:/postgres/%timestamp%echo%backup_dir%"C:/ProgramFiles/PostgreSQL/15/bin/pg_dump.exe"-Upostgres-hlocalhos......