为什么Postgres的计划时间和执行时间差异如此之大?

25
我有一个查询。
EXPLAIN (ANALYZE, BUFFERS)
        SELECT COUNT(id) q, day
        FROM my_table
        WHERE role_id && ARRAY[15, 17]
        GROUP BY "day"
        ORDER BY "day" DESC;

Postgres给我回复如下:
计划时间:0.286毫秒 执行时间:127.233毫秒
为什么会这样呢?我觉得差距太大了。

你为什么这样想?你为什么认为计划时间和执行时间之间应该有关联呢? - user330315
对不起,我以错误的方式考虑了。 - Albert Tobac
2
简短回答是:计划时间并非预期执行时间,而是用于猜测如何执行查询的时间。我之前也曾误解这一点。 - EAmez
2个回答

64
我认为你有一个小误解。我试着简单描述一下查询的过程:
  1. 您在SQL中编写了一个查询,这是一种“脚本”,您试图告诉服务器您想要从它那里获取什么。
  2. 大多数情况下,通过编写查询,服务器可以以许多方式收集您要求的数据。这是称为“查询计划器”的机制开始运作的地方。它尝试找到最快执行查询的方式(计划)。通过估计几种可能的方式(计划)的执行时间来实现此目的。
  3. 服务器使用被认为最快的计划运行查询。
  4. 服务器返回输出。
EXPLAIN 命令打印出该过程的描述。现在:
  • 执行时间EXPLAIN 输出上是服务器在步骤 3-4 上花费的时间。
  • 计划时间EXPLAIN 输出上是服务器仅花费在第二步所用的时间。我认为你认为它是“规划程序认为查询需要花费的时间”,但是可以称之为“计划 [执行] 时间”或“预估执行时间”。
因此,没有理由计划时间和执行时间之间的差异应该更小。PostgreSQL 希望保持计划时间短,以使其对整个执行时间的影响最小。 所有内容都写在手册中
请注意,执行时间不包括计划时间。如果您想要一个清晰的例子,其中仅计划时间长于执行时间,您可以尝试查询 explain analyse select 1

当使用explain命令时,历史记录中的Total query runtime是什么意思? - Slim
1
@Gabriel的信使 - 非常好的答案 - 有礼貌,全面,易于理解,并附有文档链接。 :) - fanny
1
注意,执行时间包括步骤2。我曾经看到解释时间比执行时间长,因此它们不会重叠。 - Chris Travers

1
EXPLAIN ANALYSE 命令执行两个操作:计算 Postgres 执行查询计划所需的时间,并确定查询执行的时间。预计查询计划的生成速度比执行查询本身要快得多。如果提供 EXECUTE 命令的完整输出,可能可以给出更好的解释。文档中包含了一个相当详细的detailed explanation.

这是 ANALYZE 而不是 ANALYSE - Gabriel's Messanger
15
都是有效的。 - user330315
@a_horse_with_no_name 谢谢,我不知道那个。 - Gabriel's Messanger
3
PostgreSQL同时支持英式英语和美式英语。ANALYZE和ANALYSE都是有效的。 - A. Scherbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接