为什么 Postgres EXPLAIN ANALYZE execution_time 与我 运行 实际查询时不同?

Why is Postgres EXPLAIN ANALYZE execution_time different than when I run the actual query?

我正在使用数据库客户端进行测试。

使用EXPLAIN ANALYZE:

Hash Join  (cost=5.02..287015.54 rows=3400485 width=33) (actual time=0.023..1725.842 rows=3327845 loops=1)
  Hash Cond: ((fact_orders.financial_status)::text = (include_list.financial_status)::text)
  CTE include_list
    ->  Result  (cost=0.00..1.77 rows=100 width=32) (actual time=0.003..0.004 rows=4 loops=1)
          ->  ProjectSet  (cost=0.00..0.52 rows=100 width=32) (actual time=0.002..0.003 rows=4 loops=1)
                ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.000..0.000 rows=1 loops=1)
  ->  Seq Scan on fact_orders  (cost=0.00..240253.85 rows=3400485 width=38) (actual time=0.006..551.558 rows=3400485 loops=1)
  ->  Hash  (cost=2.00..2.00 rows=100 width=32) (actual time=0.009..0.009 rows=4 loops=1)
        Buckets: 1024  Batches: 1  Memory Usage: 9kB
        ->  CTE Scan on include_list  (cost=0.00..2.00 rows=100 width=32) (actual time=0.004..0.007 rows=4 loops=1)
Planning time: 0.163 ms
Execution time: 1852.226 ms

根据上面的查询,我的执行时间是1852.226毫秒。

返回了大约 330 万条记录。

但是当我 运行 没有 EXPLAIN ANALYZE 的查询时,大约需要 ~30 秒才能从我的数据库客户端取回结果。

额外的28秒是从服务器到客户端的传输时间吗?还是执行查询的实际时间?

编辑:客户端是 Navicat。使用结果显示在屏幕上后经过的时间。

documentation says:

Keep in mind that the statement is actually executed when the ANALYZE option is used. Although EXPLAIN will discard any output that a SELECT would return, other side effects of the statement will happen as usual.

因此 运行 对 select 查询的解释与 运行 实际查询之间的唯一区别是实际上并未获取数据。您的查询 returns 大量记录,因此只能很好地解释您所看到的差异。