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

时间:2015-11-05 16:32:34

标签: postgresql query-planner

我做了这样的查询

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毫秒

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

2 个答案:

答案 0 :(得分:23)

我认为对你的误解很小。我试着简要描述运行查询时会发生什么:

  1. 您在SQL中编写了一个查询,这是一种"脚本"你试图告诉服务器你想从他那里得到什么。
  2. 大多数时候,服务器通过编写查询来收集您要求的数据的方式很多。有一种机制称为"查询计划器"采取行动。它试图找到执行查询的最快方式(计划)。它是通过估计几种可能的方式(计划)的执行时间来实现的。
  3. 服务器使用被认为是最快的计划运行查询。
  4. 服务器返回输出。
  5. EXPLAIN命令打印出您对该过程的描述。现在:

      {li> EXPLAIN输出上的执行时间是时间服务器在步骤3-4上花费的时间。 {li> 计划时间 EXPLAIN输出时间服务器仅花费在第2步上。我相信你认为它是"时间规划师认为查询将采用" ,但这可以被称为"计划[执行]时间"或者"估计执行时间"。

    所以没有理由为什么计划时间和执行时间差应该更小。 PostgreSQL希望缩短计划时间,以最大限度地减少它对整个执行时间的影响。

    全部写成here in manual

    注意:执行时间不包括计划时间,您可以尝试explain analyse select 1查看PlanningTime>ExecutionTime的案例。

答案 1 :(得分:0)

EXPLAIN ANALYSE命令执行两项操作:它计算Postgres计算查询计划所需的时间,其次,它确定查询执行的时间。预计提出查询计划比执行查询本身要快得多。如果您提供了EXECUTE命令的完整输出,则可以为您提供更好的解释。该文档包含一个detailed explanation