解释

来自 PostgreSQL 维基
跳转到导航跳转到搜索

吉尔伯托·卡斯蒂略注:我在谷歌上找到了这篇文章,并做了一些修改。

EXPLAIN:显示 Postgres 后端显式查询计划。

EXPLAIN [ VERBOSE ] 查询

VERBOSE:标志用于显示查询的详细计划。

输入

   Cualquier consulta. 

输出

NOTICE: QUERY PLAN: plan

描述


该命令显示 Postgres 计划程序为给定查询生成的执行计划。执行计划显示将如何扫描引用的表;无论是平面顺序扫描、索引扫描等。如果引用了多个表,则将使用哪些连接算法将每个输入表的所需元组分组在一起。

VERBOSE 选项会发出计划树的完整内部表示,而不是摘要(并将其发送到 postmaster 的日志文件)。通常,此选项仅对 Postgres 的错误修正(调试)有用。

示例 1. 要显示对具有单个 int4 类型列的表的简单查询的查询计划

EXPLAIN SELECT * FROM foo;
   NOTICE:  QUERY PLAN:
Seq Scan on foo  (cost=0.00..2.28 rows=128 width=4)
      *.Costo inicio estimado (tiempo inicial que toma devolverse la primer tupla)
      *.Costo total estimado (tiempo total para devolver todas las tuplas: por ejemplo, si se limita el número de tuplas a devolver con una cláusula
        LIMIT, el planificador realiza una interpolación apropiada entre los dos costos finales para estimar cuál de los planes es realmente el menos
        costoso.)
      *.Número estimado de filas escaniadas (Se cumple solamente si la ejecución de la consulta es completa.)
      *.Cantidad estimado de filas de salida. 

估计的成本是(磁盘页面读取 * seq_page_cost)+(扫描的行数 * cpu_tuple_cost)。默认情况下,seq_page_cost 为 1.0,cpu_tuple_cost 为 0.01。估计的成本值为 (2,24 * 1.0) + (4 * 0.01) = 2.28

seq_page_cost (floating point)
  La suposición del planificador sobre el costo medido en unidades de captura de páginas de disco. Por defecto es 1.0. 
cpu_tuple_cost (floating point)
  La suposición del planificador sobre el costo de procesamiento de cada fila durante la consulta. Por defecto es 0.01.

示例 2. 对于具有用于在查询中实现等值连接条件的索引的相同表,EXPLAIN 将显示不同的计划

EXPLAIN SELECT * FROM foo WHERE i = 4;
   NOTICE:  QUERY PLAN:
Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)

示例 3. 最后,对于具有用于在查询中实现等值连接条件的索引的相同表,EXPLAIN 将为使用聚合函数的查询显示以下内容

EXPLAIN SELECT sum(i) FROM foo WHERE i = 4;
   NOTICE:  QUERY PLAN:
Aggregate  (cost=0.42..0.42 rows=1 width=4)
 ->  Index Scan using fi on foo  (cost=0.00..0.42 rows=1 width=4)
   

总结


Explain 是查询执行的估计成本的表示,它是计划程序对运行查询所需时间的假设(以磁盘页面捕获单位衡量)。它们显示两个数字:返回第一个元组的初始时间,以及返回所有元组的总时间。对于大多数查询,重要的是总时间,但在某些情况下,例如 EXISTS 子查询,计划程序将选择最短的初始时间而不是最短的总时间(因为无论如何执行器将在获取第一个元组后停止)。此外,如果使用 LIMIT 子句限制要返回的元组数量,计划程序会在两个最终成本之间进行适当的插值,以估计哪个计划实际上是最廉价的。