PostgreSQL 調整 Big Table 的注意事項

在一個大的 table(超過千萬筆以上的資料)做 tabel 的操作(加欄位、加 index、等,變更 schema 的動作)要小心造成 lock table

Safe Operations For High Volume PostgreSQL - Braintree (opens new window) 這篇文章有寫幾種狀況是不會 lock table 例如 add a new column

有些狀況會 lock table 例如 add ad index,然後可以看 our workaround 這個部分知道有分享他們是怎樣避免 lock 的

不過其中有一個是 add an index 可以加上 CONCURRENTLY 這個關鍵字去避免 lock table


When this option is used, PostgreSQL will build the index without taking any locks that prevent concurrent inserts, updates, or deletes on the table; whereas a standard index build locks out writes (but not reads) on the table until it's done. There are several caveats to be aware of when using this option


不過呢,實際上還是有可能會被卡到(application 層會造成有些 connection 成功有些 connection timeout),如果這個 table 有大量的 insert, update。

所以還是要小心,另外 expression indexes and partial indexes 也無法用 CONCURRENTLY 這個關鍵字