解释分析:执行任务所花费的总时间。文档错误还是我的错误?
Explain analyze: Total time spent executing a task. Documentation error or my error?
我认为在有关解释计划的 postgres 文档中发现了一个错误,并可能进行了更正。
发件人:https://www.postgresql.org/docs/current/using-explain.html
Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10)
"In the above example, we spent a total of 0.220 milliseconds executing the index scans on tenk2."
文档似乎表明 Actual Total Time
* Actual Loops
= 操作花费的总时间。
但是,根据我制定的 JSON 计划:
"Plans": [
{
"Node Type": "Hash Join",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Join Type": "Inner",
"Startup Cost": 66575.34,
"Total Cost": 76861.82,
"Plan Rows": 407,
"Plan Width": 290,
"Actual Startup Time": 49962.789,
"Actual Total Time": 51206.643,
"Actual Rows": 127117,
"Actual Loops": 3,
"Output": [ ... ],
...
"Execution Time": 52677.398
(完整计划为here。)
Actual Total Time
* Actual Loops
= 51 秒 * 3 = 2 分 33 秒明显超过了 Execution Time
的 52.7 秒。
我对文档的理解是否正确?
如果是这样,它不应该说,"we spent a total of 0.01 milliseconds executing the index scans on tenk2"吗?
您的 Hash Join
在 Gather
节点下:
Gather (cost=67,575.34..77,959.52 rows=977 width=290) (actual time=51,264.085..52,595.474 rows=381,352 loops=1)
Buffers: shared hit=611279 read=99386
-> Hash Join (cost=66,575.34..76,861.82 rows=407 width=290) (actual time=49,962.789..51,206.643 rows=127,117 loops=3)
Buffers: shared hit=611279 read=99386
这意味着该查询启动了两个与主后端并行运行的后台工作程序来完成散列连接(参见执行计划中的"Workers Launched": 2
)。
现在很明显,如果三个进程同时处理一个任务,总的执行时间将不是各个执行时间的总和。
换句话说,执行时间乘以循环次数的规则适用于嵌套循环连接(单线程),但不适用于查询的并行执行。
我认为在有关解释计划的 postgres 文档中发现了一个错误,并可能进行了更正。
发件人:https://www.postgresql.org/docs/current/using-explain.html
Index Scan using tenk2_unique2 on tenk2 t2 (cost=0.29..7.91 rows=1 width=244) (actual time=0.021..0.022 rows=1 loops=10)
"In the above example, we spent a total of 0.220 milliseconds executing the index scans on tenk2."
文档似乎表明 Actual Total Time
* Actual Loops
= 操作花费的总时间。
但是,根据我制定的 JSON 计划:
"Plans": [
{
"Node Type": "Hash Join",
"Parent Relationship": "Outer",
"Parallel Aware": false,
"Join Type": "Inner",
"Startup Cost": 66575.34,
"Total Cost": 76861.82,
"Plan Rows": 407,
"Plan Width": 290,
"Actual Startup Time": 49962.789,
"Actual Total Time": 51206.643,
"Actual Rows": 127117,
"Actual Loops": 3,
"Output": [ ... ],
...
"Execution Time": 52677.398
(完整计划为here。)
Actual Total Time
* Actual Loops
= 51 秒 * 3 = 2 分 33 秒明显超过了 Execution Time
的 52.7 秒。
我对文档的理解是否正确?
如果是这样,它不应该说,"we spent a total of 0.01 milliseconds executing the index scans on tenk2"吗?
您的 Hash Join
在 Gather
节点下:
Gather (cost=67,575.34..77,959.52 rows=977 width=290) (actual time=51,264.085..52,595.474 rows=381,352 loops=1)
Buffers: shared hit=611279 read=99386
-> Hash Join (cost=66,575.34..76,861.82 rows=407 width=290) (actual time=49,962.789..51,206.643 rows=127,117 loops=3)
Buffers: shared hit=611279 read=99386
这意味着该查询启动了两个与主后端并行运行的后台工作程序来完成散列连接(参见执行计划中的"Workers Launched": 2
)。
现在很明显,如果三个进程同时处理一个任务,总的执行时间将不是各个执行时间的总和。
换句话说,执行时间乘以循环次数的规则适用于嵌套循环连接(单线程),但不适用于查询的并行执行。