为什么 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。使用结果显示在屏幕上后经过的时间。
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 大量记录,因此只能很好地解释您所看到的差异。
我正在使用数据库客户端进行测试。
使用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。使用结果显示在屏幕上后经过的时间。
Keep in mind that the statement is actually executed when the
ANALYZE
option is used. AlthoughEXPLAIN
will discard any output that aSELECT
would return, other side effects of the statement will happen as usual.
因此 运行 对 select
查询的解释与 运行 实际查询之间的唯一区别是实际上并未获取数据。您的查询 returns 大量记录,因此只能很好地解释您所看到的差异。