解释
吉尔伯托·卡斯蒂略注:我在谷歌上找到了这篇文章,并做了一些修改。
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 子句限制要返回的元组数量,计划程序会在两个最终成本之间进行适当的插值,以估计哪个计划实际上是最廉价的。