大家都熟知幾個資料庫操作的語法,select,insert,delete與update.
我們來看這幾個語法,先由 update 來入手.
先建立一個 table, 指定不做 autovacuum.
我們可以使用 pg_dirtyread 來觀察,還沒做 vacuum 時的情況.
可以觀察到在做 vacumm 之前, 做了兩次 update, 做了一次 delete,最後做 delete.
第一次 update, 將 SONE-009, 變更為 SSIS-911, 並變更 timestamp.
第二次 update, 將 SSIS-911, 變更為 SSIS-931, 並變更timestamp.
可以看到,ctid xmin, max 的變化, dead 標誌為 true.
接著兩個動作, delete 將 SSIS-931 那筆標誌為 dead.
insert 輸入最新的 SSIS-894, 以及 timestamp.
我們可以把 delete 的動作,理解成做查詢(select), 其實語法是幾乎一樣,除了沒有 select 欄位,找到將後dead 標誌為 true.
insert 就是 insert 了.
update 就可以理解為 delete 與 insert 的組合.
這樣就能夠理解那段做1000次 update , table的使用空間是 64K.
因為其實就是做了1000次 delete, insert.
透過理解指令的內部動作,對後續我們開發系統時,能夠更深入的思考規劃.