PostgreSQL EXPLAIN

本文学习如何使用PostgreSQL EXPLAIN语句分析SQL执行计划。

1. PostgreSQL EXPLAIN语句

EXPLAIN语句返回给定SQL语句的PostgreSQL分析引擎生成的执行计划。展示语句中涉及的表如何被索引扫描或顺序扫描等,如果使用多个表,应用哪种join算法。
EXPLAIN 语句返回最重要的、有用的信息是返回第一行之前的起始成本和返回完整结果集的总成本。
下面是EXPLAIN 语法:

EXPLAIN [ ( option [, ...] ) ] sql_statement;

其中option 可以是下面内容:


ANALYZE [ boolean ]
VERBOSE [ boolean ]
COSTS [ boolean ]
BUFFERS [ boolean ]
TIMING [ boolean ]  
SUMMARY [ boolean ]
FORMAT { TEXT | XML | JSON | YAML }

boolean 表示选项开关。可以使用 TRUE, ON, 或1 启用选项, FALSE, OFF, 或0 禁用选项. 如果忽略boolean选项,缺省为启用。

  • ANALYZE

ANALYZE 选项首先执行sql语句,然后返回实际运行时间统计信息。其中包括每个集合节点总耗时及实际返回行数。
ANALYZE 语句实际执行SQL语句并丢弃输出信息,因此如果想分析INSERT, UPDATE, 或 DELETE且不影响数据,应该在事务中包裹EXPLAIN ANALYZE:

BEGIN;
    EXPLAIN ANALYZE sql_statement;
ROLLBACK;
  • VERBOSE

VERBOSE 参数可以显示执行集合更多信息,默认为false。

  • COSTS

COSTS 选项包括每个计划节点的估计启动成本和总成本,以及查询计划中的估计行数和估计行的宽度。默认为TRUE。

  • BUFFERS

该参数增加信息至buffer。BUFFERS 参数仅当ANALYZE 启用时才能使用。缺省为FALSE。

  • TIMING

该参数包括实际启动时间及每个节点花费时间。TIMING 缺省为TRUE,仅当ANALYZE 启用时才能使用。

  • SUMMARY

SUMMARY 参数在查询计划之后摘要信息(如总耗时)。当ANALYZE 启用时,缺省包括摘要信息。

  • FORMAT

指定查询计划输出格式,如TEXT, XML, JSON, YAML。缺省为TEXT。

2. PostgreSQL EXPLAIN 示例

下面语句展示简单查询film表的执行计划:

EXPLAIN SELECT * FROM film;

输出如下:

在这里插入图片描述

下面示例展示查询特定film_id的执行计划:

EXPLAIN SELECT * FROM film WHERE film_id = 100;

输出如下:
在这里插入图片描述

因为film_id是索引,语句返回执行计划不一样。输出中计划使用索引扫描代替对film表的顺序扫描。
如果不需要显示成本,可以使用COSTS 选项:

EXPLAIN (COSTS FALSE) SELECT
    *
FROM
    film
WHERE
    film_id = 100;

在这里插入图片描述

下面示例显示使用聚集函数查询的执行计划:

EXPLAIN SELECT COUNT(*) FROM film;

输出如下:
在这里插入图片描述

下面示例返回多个表关联查询的执行计划:

EXPLAIN
SELECT
    f.film_id,
    title,
    name category_name
FROM
    film f
    INNER JOIN film_category fc 
        ON fc.film_id = f.film_id
    INNER JOIN category c 
        ON c.category_id = fc.category_id
ORDER BY
    title;

输出如下:
在这里插入图片描述

需要在输出中增加运行时间统计,需要使用ANALYZE选项:

EXPLAIN ANALYZE
    SELECT
        f.film_id,
        title,
        name category_name
    FROM
        film f
        INNER JOIN film_category fc 
            ON fc.film_id = f.film_id
        INNER JOIN category c 
            ON c.category_id = fc.category_id
    ORDER BY
        title;

输出如下:
在这里插入图片描述

3. 总结

本文学习了如何使用PostgreSQL EXPLAIN展示sql语句的执行计划。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值