3 つのインデックスを持つ 2 億 5000 万行を含むテーブルで UPDATE を実行しています。この UPDATE は、3,000 万行を含む別のテーブルを使用します。現在、約 36 時間実行されています。彼らがそれを行うのにどれだけ近いかを知る方法であるかどうか疑問に思っています。それでも、あと 1 日か 2 日しか必要ない場合は、そのまま実行します。コマンドクエリは次のとおりです。
UPDATE pagelinks SET pl_to = page_id
FROM page
WHERE
(pl_namespace, pl_title) = (page_namespace, page_title)
AND
page_is_redirect = 0
;
EXPLAIN はここでは問題ではありません。UPDATE にかかる時間をいくらか正当化するために、大きなテーブルに複数のインデックスがあることについてのみ言及します。しかし、とにかく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)
ここで、ページリンクのインデックスの1 つを削除するために、並列クエリ コマンドも送信しました。もちろん、UPDATE が完了するのを待っています (しかし、とにかく試してみたいと思いました!)。したがって、データが破損することを恐れて、ページリンクから何も選択できません( DROP INDEX ポストマスター プロセスを強制終了しても安全だと思わない限りは?)。
だから、デッドタプルの量を追跡するテーブルなのか、それとも何かのテーブルなのか疑問に思っています.UPDATEがタスクを完了するまでの速度や距離を知ることができれば幸いです。
Thx (PostgreSQL は思ったほどインテリジェントではありません。ヒューリスティックが必要です)