PostgreSQL学习第十三篇 执行计划

PostgreSQL中explain的语法:
explain [option] statement
explain [analyze] [verboase] statement

命令的可选选项option为:
analyze
verbose
costs
buffers
format(text|xml|json|yaml)
analyze选项通过实际执行的sql来获得相应的执行计划。(实际执行)
verbose用于显示计划的附加信息:计划树中每个节点输出的各个列,如果触发器被触发,还有触发器名称。默认为false
costs选项显示每个计划节点的启动成本和总成本,以及估计行数和每行宽度。默认为TRUE
buffers:显示关于缓冲区的使用信息。该参数只能与analyze参数一起使用。显示的缓冲区信息包括共享块、本地块和临时块读写的快熟。默认为false
format指定输出格式。默认为TEXT


explain输出结果解释
简单示例:
postgres=# explain select * from dog;
                       QUERY PLAN                       
--------------------------------------------------------
 Seq Scan on dog  (cost=0.00..20.80 rows=1080 width=47)
(1 row)

 Seq Scan on dog:全表扫描
cost=0.00..20.80:启动成本:0.00      返回所有数据的成本:20.80
rows=1080:会返回1080行
width=47:每行平均宽度是47字节

默认情况下不同操作的cost值:

	1. 顺序扫描一个数据库,cost值为1
	2. 随机扫描一个数据块,cost值为4
	3. 处理一个数据行的CPU,cost为0.01
	4. 处理一个索引行的CPU,cost为0.005
	5. 每个操作符的CPU代价为0.0025


以不同格输出:
explain (format json|xml|yaml) select ....

加analyze参数后,可通过实际执行来获得更精确的执行计划。
explain analyze select * ....
explain (analyze true) select * ...

如果只查看执行的路径,不看cost值:
select (costs false) select * ...

联合使用analyze选项和buffers选项,可通过实际执行来查看实际的代价和缓冲区命中情况:
explain (analyze true,buffers true) select * from ....
postgres=# explain (analyze true,buffers true) select * from dog;
                                            QUERY PLAN                                           
--------------------------------------------------------------------------------------------------
 Seq Scan on dog  (cost=0.00..20.80 rows=1080 width=47) (actual time=0.006..0.006 rows=1 loops=1)
   Buffers: shared hit=1
 Planning time: 0.027 ms
 Execution time: 0.019 ms
(4 rows)

可以查看插入,删除等的计划,但是如果加了analyze,就会真的执行,请注意!

全表扫描:Seq Scan
索引扫描:Index Scan
位图扫描:也是走索引的一种方式。方法是扫描索引,把满足条件的行或块在内存中建一个位图,扫描完索引后,再根据位图到表的数据文件中把相应的数据读出来。如果走了两个索引,可以把两个索引形成的位图进行and或or计算,合并成一个位图,再到表的数据文件中把数据读出来。
当执行计划的结果行数很多时会进行这种扫描,如非等值查询、IN子句或有多个条件都可以走不同的索引时。

条件过滤:Filter
嵌套循环连接:Nestloop Join,是在两个表做连接时最朴素的一种连接方式。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,要把返回子集较小的表作为外表。而且在内表的连接字段上要有索引,否则会很慢。外表为驱动表。

Hash Join:散列连接,优化器使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。

Merge Join:合并连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丹心明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值