我一直在对包含 3 个索引的 2.5 亿行的表运行更新;此 UPDATE 使用另一个包含 3000 万行的表。它已经运行了大约 36 个小时。我想知道他们是否是一种了解它距离完成有多近的方法,如果它计划花费一百万天来完成它,我会杀了它;但是,如果它只需要一两天,我会让它运行。这是命令查询:
UPDATE pagelinks SET pl_to = page_id
FROM page
WHERE
(pl_namespace, pl_title) = (page_namespace, page_title)
AND
page_is_redirect = 0
;
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)
现在我还发送了一个并行查询命令,以删除页面链接的索引之一;当然它正在等待更新完成(但我还是想尝试一下!)。因此,我不能从页面链接中选择任何内容,因为害怕破坏数据(除非您认为终止 DROP INDEX postmaster 进程是安全的?)。
所以我想知道他们是否是一个可以跟踪死元组数量的表或其他东西。很高兴知道 UPDATE 在完成其任务时有多快或多远。
Thx(PostgreSQL 没有我想象的那么智能;它需要启发式)