为什么 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.
我觉得你的理解有点小误会。我尝试简要描述当您 运行 查询时发生了什么:
- 你在 SQL 中写了一个查询,这是某种 "script" 你试图告诉服务器你想从他那里得到什么。
- 大多数情况下,服务器可以通过多种方式通过编写查询来收集您要求的数据。称为 "query planner" 的机制起作用了。它试图找到最快的查询执行方式(计划)。它通过估计几种可能的方式(计划)的执行时间来做到这一点。
- 服务器运行使用被认为是最快的计划的查询。
- 服务器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]的情况=].
我这样查询
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.
我觉得你的理解有点小误会。我尝试简要描述当您 运行 查询时发生了什么:
- 你在 SQL 中写了一个查询,这是某种 "script" 你试图告诉服务器你想从他那里得到什么。
- 大多数情况下,服务器可以通过多种方式通过编写查询来收集您要求的数据。称为 "query planner" 的机制起作用了。它试图找到最快的查询执行方式(计划)。它通过估计几种可能的方式(计划)的执行时间来做到这一点。
- 服务器运行使用被认为是最快的计划的查询。
- 服务器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]的情况=].