域名 AXUM.RS 将于2025年10月到期。我们无意再对其进行续费,我们希望你能够接续这个域名,让更多 AXUM 开发者继续受益。现在,我们已启用新域名 AXUM.EU.ORG
  • 方案AXUM.RS 域名 = 3000
如果你有意接续这份 AXUM 情怀,请与我们取得联系。
说明:
  1. 如果有人购买 AXUM.RS 域名,或者该域名到期,本站将使用免费域名 AXUM.EU.ORG 继续提供服务。

性能分析

PostgreSQL 提供了 EXPLAIN 语句,它可以用来分析 SQL 的执行情况。本章将对其进行讨论。

简介

explain 语句返回 PostgreSQL 规划器为给定 SQL 语句生成的执行计划。它显示了一条语句涉及的表将通过索引扫描或顺序扫描等方式进行扫描,以及如果使用多张表,将使用什么样的连接算法。

它返回的最重要和最有用的信息是,返回第一行数据之前的起始成本及返回完整结果集的总成本。

它的语法如下:

选项 的可选值是:

以下选项的 boolen 是一个开关,通过传递 TRUEFALSE 来打开或关闭某个选项。

示例

film 进行简单的 EXPLAIN

EXPLAIN SELECT * FROM film;

/*结果
                        QUERY PLAN
----------------------------------------------------------
 Seq Scan on film  (cost=0.00..64.00 rows=1000 width=384)
 */
EXPLAIN SELECT * FROM film WHERE film_id = 100;

/*结果
                               QUERY PLAN
------------------------------------------------------------------------
 Index Scan using film_pkey on film  (cost=0.28..8.29 rows=1 width=384)
   Index Cond: (film_id = 100)
*/   

由于 film_id 已建立索引,所以它使用的是按索引扫描,而不是顺序扫描。

要抑制成本,可以使用 COSTS 选项:

 EXPLAIN (COSTS FALSE) SELECT * FROM film WHERE film_id = 100;
 /*结果
             QUERY PLAN
------------------------------------
 Index Scan using film_pkey on film
   Index Cond: (film_id = 100)
*/   

使用聚合函数:

EXPLAIN SELECT COUNT(*) FROM film;
/* 结果
                          QUERY PLAN
--------------------------------------------------------------
 Aggregate  (cost=66.50..66.51 rows=1 width=8)
   ->  Seq Scan on film  (cost=0.00..64.00 rows=1000 width=0)
*/

使用多表连接:

 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;
 
/* 结果
                                      QUERY PLAN
--------------------------------------------------------------------------------------
 Sort  (cost=149.64..152.14 rows=1000 width=87)
   Sort Key: f.title
   ->  Hash Join  (cost=77.86..99.81 rows=1000 width=87)
         Hash Cond: (fc.category_id = c.category_id)
         ->  Hash Join  (cost=76.50..95.14 rows=1000 width=21)
               Hash Cond: (fc.film_id = f.film_id)
               ->  Seq Scan on film_category fc  (cost=0.00..16.00 rows=1000 width=4)
               ->  Hash  (cost=64.00..64.00 rows=1000 width=19)
                     ->  Seq Scan on film f  (cost=0.00..64.00 rows=1000 width=19)
         ->  Hash  (cost=1.16..1.16 rows=16 width=72)
               ->  Seq Scan on category c  (cost=0.00..1.16 rows=16 width=72)
*/

添加 ANALYZE ,将实际运行时统计信息添加到输出中:

要查看完整内容,请先登录