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

Alb*_*bac 6 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;
Run Code Online (Sandbox Code Playgroud)

Postgres用这个回复我:

规划时间:0.286 ms
执行时间:127.233 ms

为什么是这样 ?我认为差异太大了

Gab*_*ger 30

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

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

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

  • 执行时间上的EXPLAIN输出是花在步骤3-4的时间服务器.
  • 规划时间EXPLAIN输出时间花在服务器步骤2只.我相信你认为它是"时间规划者认为查询需要",但这可以称为"计划[执行]时间"或"估计执行时间".

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

所有内容都是用手册写的.


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