Postgresql
ALTER TABLE … ADD COLUMN on a small table 需要很長時間,pg_stat_activity 不顯示此表上的任何查詢
所以這是永遠掛起的查詢:
ALTER TABLE tasks ADD COLUMN in_progress BOOLEAN NOT NULL DEFAULT FALSE;
該表的
tasks
行數少於 20,000 行,每 5 分鐘左右查詢一次。我檢查了
pg_stat_activity
10 次,它從未顯示任何鎖定表的查詢: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 執行的查詢(我多次無效/重新連接以防萬一)。
必須有人在桌子上持有鎖,這意味著您有一個未結交易。那是一個錯誤;任何交易都不應該保持開放。
要找出哪些會話阻止了您的陳述:
- 在執行之前
ALTER TABLE
,執行SELECT pg_backend_pid();
- 執行掛
ALTER TABLE
。- 啟動一個新的數據庫會話並執行
SELECT pg_blocking_pids(12345);
其中 12345 是上一個查詢的結果。 4. 終止您在上一個查詢中找到的會話
SELECT pg_terminate_backend(54321);