xiongcccc / gitalk-comment

gitalk-comment of postgres-howto
0 stars 0 forks source link

EXPLAIN ANALYZE or EXPLAIN (ANALYZE, BUFFERS) #6

Open xiongcccc opened 3 weeks ago

xiongcccc commented 3 weeks ago

https://xiongcccc.github.io/postgres-howtos/#/./docs/1

Description

xiongcccc commented 1 week ago

最近在 Greenplum 数据库中遇到了一个完全相反的现象,即 explain analyze + SQL 的方式要远慢于 \timing + SQL 的方式,经过研发同事分析,原因如下:

  1. explain analyze 执行是自己调用 Executor 相关的函数执行,但逻辑跟普通执行有差别
  2. 普通执行在 ExecutorEnd 会触发 dispatch DISPATCH_WAIT_FINISH,让没执行完的 QE 结束
  3. explain analyze 在 ExecutroRun 之后,会 dispatch DISPATCH_WAIT_NONE,这会等待所有 QEs 结束,所以会慢
  4. 如果 explain analyze 在 ExecutroRun 之后,dispatch DISPATCH_WAIT_FINISH 可以跟普通执行一样快

也就是说,容易出现在各个 QE 数据量不均衡 + limit,导致有的节点很快,有的很慢,不带 explain analyze 跑,当某个节点提供足够数据之后,会触发 QueryFinish,使没完成的节点退出。