Postgresql
有沒有辦法確定一個事務修改了多少行(在事務結束之前)?
我有一個約 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
在此方案下,an
UPDATE
通過將xmax
目標記錄DELETE
的xmin``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 應該不會太難。