为什么 Postgres 的计划时间和执行时间如此不同?

Why Planing time and Execution time are so different Postgres?

我这样查询

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 回复我:

Planning time: 0.286 ms
Execution time: 127.233 ms

这是为什么?我觉得差别太大了

EXPLAIN ANALYSE 命令做两件事:它计算 Postgres 计算查询计划所需的时间,其次,它确定查询执行需要多长时间。预计提出查询计划比执行查询本身要快得多。如果您提供 EXECUTE 命令的完整输出,可能会给您更好的解释。该文档包含相当 detailed explanation.

我觉得你的理解有点小误会。我尝试简要描述当您 运行 查询时发生了什么:

  1. 你在 SQL 中写了一个查询,这是某种 "script" 你试图告诉服务器你想从他那里得到什么。
  2. 大多数情况下,服务器可以通过多种方式通过编写查询来收集您要求的数据。称为 "query planner" 的机制起作用了。它试图找到最快的查询执行方式(计划)。它通过估计几种可能的方式(计划)的执行时间来做到这一点。
  3. 服务器运行使用被认为是最快的计划的查询。
  4. 服务器returns你输出。

EXPLAIN 命令打印您对该过程的描述。现在:

  • EXPLAIN 输出上的 执行时间是服务器在步骤 3-4 上花费的时间。
  • EXPLAIN 输出上的计划时间 时间 服务器只花费在 第 2 步.我相信你认为它是 "time planner thinks that query would take",但它可以被称为 "planned [execution] time" 或 "estimated execution time".

所以没有理由计划时间和执行时间差应该更小。 PostgreSQL 希望缩短计划时间以尽量减少它对整个执行时间的影响。

全部写here in manual.


注意:执行时间不包括计划时间,你可以试试explain analyse select 1看[=14]的情况=].