Postgresql

有沒有辦法確定一個事務修改了多少行(在事務結束之前)?

  • February 12, 2019

我有一個約 3.2 億行的表,我在其上執行以下查詢:

UPDATE my_table SET state = TRIM(state)

不用說,這已經執行了 90 多個小時(從星期四下午開始)並且還沒有完成。

我想或多或少地知道到目前為止它已經修改了多少行。有沒有辦法從正在執行的事務中獲取這些資訊?

嘗試搜尋時,我發現如何粗略估計使用該函式將多少行添加到表中pgstattuple

select dead_tuple_count from pgstattuple('my_table');

但這似乎沒有顯示關於已修改多少行的任何有趣資訊。

至少有一種方法可以查看 uncommitted 的進度UPDATE,儘管它有點笨拙。

Postgres 通過行版本控制處理事務隔離。他們的實現涉及使用允許查看的最小和最大事務 ID(分別為xmin和)標記每個記錄版本。xmax

在此方案下,anUPDATE通過將xmax目標記錄DELETExmin``INSERT

可以查詢這些系統列UPDATE,因此給定(您可以從中獲取pg_stat_activity.backend_xid)的事務 ID,您可以找出它處理了多少行,例如:

SELECT COUNT(*)
FROM my_table
WHERE xmax = 2357

如果事務設置了任何保存點,事情會變得有點混亂,在這種情況下,這xmax將是一個子事務 ID,它不會出現在pg_stat_activity(或其他任何地方,據我所知)。在這種情況下,您可以通過進行中或回滾的事務檢查已標記為更新/刪除的所有行,其中:

SELECT xmax, COUNT(*)
FROM my_table
WHERE xmax <> 0
GROUP BY xmax

…從那裡開始,找出您感興趣的 ID 應該不會太難。

引用自:https://dba.stackexchange.com/questions/229388