我一直在对一个包含250万行和3个索引的表进行UPDATE操作,这个UPDATE操作使用了另一个包含3000万行的表。目前已经运行了大约36小时。我想知道是否有方法可以找出它完成的进度,如果它计划花费100万天来完成它的任务,那么我会终止它;但是如果只需要再过一两天,我将让它继续运行。以下是命令查询:
UPDATE pagelinks SET pl_to = page_id
FROM page
WHERE
(pl_namespace, pl_title) = (page_namespace, page_title)
AND
page_is_redirect = 0
;
这里并不是问题在于EXPLAIN,我只提到大表有多个索引,以此来解释它更新所需的时间。但无论如何,这是EXPLAIN结果:
Merge Join (cost=127710692.21..135714045.43 rows=452882848 width=57)
Merge Cond: (("outer".page_namespace = "inner".pl_namespace) AND ("outer"."?column4?" = "inner"."?column5?"))
-> Sort (cost=3193335.39..3219544.38 rows=10483593 width=41)
Sort Key: page.page_namespace, (page.page_title)::text
-> Seq Scan on page (cost=0.00..439678.01 rows=10483593 width=41)
Filter: (page_is_redirect = 0::numeric)
-> Sort (cost=124517356.82..125285665.74 rows=307323566 width=46)
Sort Key: pagelinks.pl_namespace, (pagelinks.pl_title)::text"
-> Seq Scan on pagelinks (cost=0.00..6169460.66 rows=307323566 width=46)
现在我还发送了一个并行查询命令,以便删除其中一个 "pagelinks" 的索引;当然,它正在等待 UPDATE 完成(但我还是想试一试!)。因此,我不能从 "pagelinks" 中选择任何内容,以免破坏数据(除非您认为杀死 DROP INDEX postmaster 进程是安全的?)。
因此,我想知道是否有一个表可以跟踪死元组的数量或其他内容,这样就可以了解 UPDATE 任务完成的速度和进度。
谢谢 (PostgreSQL 不像我想象的那么智能,它需要启发式算法)
pg_locks
。 - user330315