PostgreSQL EXPLAIN ANALYZE使用和检查SQL性能问题

一、PostgreSQL explain介绍

PG的explain工作原理是基于表和索引的统计信息,这些统计信息主要存储在系统表pg_statistic,也可以通过视图pg_stats来查看统计信息,包括表的列,行数,distinct值、null值等。统计信息一般是在vacuum或者analyze的时候进行更新。

下面是一个简单的例子:

通过explain可以查看SQL查询的计划以及基表的扫描方式、基表的估计行数和估计cost以及多表的连接顺序、连接方式和连接的估计行数和估计cost。上面的例子表a和表b都是使用顺序扫描,估计的行数分别是1和99999,两者通过嵌套循环进行连接,连接后估计行数是99999。

explain的语法结构:

EXPLAIN [ ( option [, ...] ) ] statement
EXPLAIN [ ANALYZE ] [ VERBOSE ] statement
where option can be one of:
ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
SETTINGS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }

可以通过使用EXPLAINANALYZE选项来检查优化器估计值的准确性。通过使用ANALYZE选项,EXPLAIN会实际执行该查询,然后显示真实的行计数和在每个计划结点中累计的真实运行时间,还会有一个普通EXPLAIN显示的估计值。

EXPLAINBUFFERS选项可以和ANALYZE一起使用来得到运行时shared buffer读写次数, BUFFERS提供的信息帮助我们标识查询的哪些部分是对 I/O 最敏感的。

 二、通过explain查找问题

1. 定位比较糟糕的统计信息

通过explain analyze查看估计rows和实际执行的rows的差别,比如下面的例子中,实际执行的行数要远小于估计的行数,因此说明现有的统计信息已经过时,需要使用analyze进行更新以得到更准确的统计值。统计信息更新后,估计行数和实际执行行数比较接近。估计行数的多少决定了表的扫描方式以及多表的连接方式。所以优化器是根据统计信息给出查询计划的。

比如下面的例子中,统计信息更正前使用顺序扫描,更正后使用索引扫描。

 2. 定位内存不够用

实际执行中如果内存不够就会使用disk产生IO操作,性能会极大的降低。通过explain analyze可以查看内存是否够用。下面的例子中我们可以看到sort排序使用了2664KB的外存。将work_mem扩大后排序使用内存,提供效率。

 3. 定位索引定义不匹配问题

通过explain可以查看索引定义是否和查询条件一致,比如下面的例子中,索引的定义是aid列的substring(filler,1,1),而查询条件是left(filler,1)。

三、查看explain计划比较友好的在线工具

1. explain.depesz.com

比较详细的显示估计和实际执行行数,每个节点的执行时间等。

2. explain.dalibo.com

很方便的查看表的连接方式和连接顺序

 

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pg Explain是用于分析和解释PostgreSQL查询执行计划的工具。通过使用Pg Explain,您可以获取有关查询优化器如何执行查询以及使用了哪些索引和操作符的详细信息。Pg Explain可以输出多种格式,如TEXT、XML、JSON和YAML,其中TEXT是默认格式。 要使用Pg Explain来分析查询执行计划,您可以使用EXPLAIN语句,后跟要分析的查询语句。执行这个查询时,PostgreSQL将返回一个详细的执行计划,包括每个操作的类型、使用的索引、扫描的行数等信息。 除了查询计划的详细信息外,Pg Explain还可以用于检查索引定义是否与查询条件一致。例如,您可以使用EXPLAIN来查看索引定义和查询条件是否匹配,以确定是否使用了正确的索引。 总之,Pg Explain是一个有用的工具,可以帮助开发人员和数据库管理员分析和优化PostgreSQL查询的执行计划。通过查看详细的执行计划信息,您可以更好地理解查询的执行过程,并进行性能调优。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [PostgreSQL EXPLAIN](https://blog.csdn.net/neweastsun/article/details/111940792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [PostgreSQL EXPLAIN ANALYZE使用检查SQL性能问题](https://blog.csdn.net/helenbi/article/details/123841896)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

helenbi

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

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

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

打赏作者

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

抵扣说明:

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

余额充值