16

我做了这样的查询

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 ms
执行时间:127.233 ms

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

4

2 回答 2

50

我觉得你的理解有点小。我尝试简要描述运行查询时发生的情况:

  1. 你用 SQL 编写一个查询,它是某种“脚本”,你试图告诉服务器你想从他那里得到什么。
  2. 大多数时候,服务器有很多方法可以通过编写查询来收集您要求的数据。有一种叫做“查询计划器”的机制可以发挥作用。它试图找到执行查询的最快方式(计划)。它通过估计几种可能的方式(计划)的执行时间来做到这一点。
  3. 服务器使用被认为最快的计划运行查询。
  4. 服务器返回你的输出。

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

  • 输出的执行时间EXPLAIN是服务器在步骤 3-4 上花费的时间。
  • 计划EXPLAIN输出时间是服务器仅在步骤 2上花费的时间。我相信您将其视为“时间计划者认为查询将花费”,但这可以称为“计划 [执行] 时间”或“估计执行时间”。

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

一切都在手册中写在这里。


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

于 2015-11-05T19:58:27.150 回答
1

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

于 2015-11-05T17:08:35.253 回答