Postgresql

ALTER TABLE … ADD COLUMN on a small table 需要很長時間,pg_stat_activity 不顯示此表上的任何查詢

  • May 27, 2022

所以這是永遠掛起的查詢:

ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN NOT NULL DEFAULT FALSE;

該表的tasks行數少於 20,000 行,每 5 分鐘左右查詢一次。

我檢查了pg_stat_activity10 次,它從未顯示任何鎖定表的查詢:

SELECT *
FROM pg_stat_activity
WHERE query LIKE '%tasks%';

--- No results

我嘗試了真空吸塵器,但沒有幫助:

VACUUM (VERBOSE, ANALYZE) tasks;

我還嘗試添加沒有約束和預設值的列,我希望它在這樣的表上幾乎是即時的,但是當我停止查詢時它執行了 1 分鐘:

ALTER TABLE tasks
ADD COLUMN in_progress BOOLEAN;

我在同一時間段內對另一個表(約 1000 行)執行了查詢,它是即時的。

任何想法?

PostgreSQL 11.13

通過 DBeaver 執行的查詢(我多次無效/重新連接以防萬一)。

必須有人在桌子上持有鎖,這意味著您有一個未結交易。那是一個錯誤;任何交易都不應該保持開放。

要找出哪些會話阻止了您的陳述:

  1. 在執行之前ALTER TABLE,執行
SELECT pg_backend_pid();
  1. 執行掛ALTER TABLE
  2. 啟動一個新的數據庫會話並執行
SELECT pg_blocking_pids(12345);

其中 12345 是上一個查詢的結果。 4. 終止您在上一個查詢中找到的會話

SELECT pg_terminate_backend(54321);

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