PostgreSQL的表檔案以及TOAST表檔案對應關係

T1YSL發表於2022-02-08

一、表和表檔案對應關係

表和索引屬於資料庫物件,在pg_calss裡都有相應的oid與之對應。
每個表都有與之相關的兩個關聯檔案,為_fsm和_vm,是空閒空間對映和可見性對映檔案。表的三個檔案也被稱為相應關係的分支(fork),空閒空間對映是表或者資料檔案的第一個分支(分支編號為1),可見性對映是資料檔案的第二個分支(分支編號為2),資料檔案的分支標編號為0。

表或索引物件被建立後會生成以relfilenode編號命名的資料檔案。該檔案有1G的大小限制,超過1G或生成新的檔案(檔名後邊加數字編號):PostgreSQL會建立並使用一個名為relfilenode.1的新檔案,如果新檔案也滿了,則會建立下一個名為relfilenode.2的新檔案,以此類推。實際上,1GB只是預設的段尺寸。段尺寸可以在編譯PostgreSQL時使用配置選項–with-segsize進行調整。

表和索引的relfilenode值會被一些命令(例如truncate,reindex,cluster)所改變,執行truncate後,會為表分配一個新的relfilenode,刪除舊的資料檔案,並建立一個新的資料檔案。如例子所示,65571是原本的表檔案,65574是新的表檔案,但truncate之後表的oid是不會發生變化的。
企業微信截圖_16443138838661.png
企業微信截圖_16443140651233.png
在9.0或者更高的版本,用函式pg_relation_filepath能根據oid或者名稱返回關係對應的檔案路徑
使用方法圖中也有演示:

select pg_relation_filepath('表名');

二、表和TOAST表檔案對應關係

TOAST是“The Oversized-Attribute Storage Technique”的縮寫,主要用於儲存一個大欄位的值。在PG中,頁是資料在檔案儲存中的基本單位,其大小是固定的且只能在編譯期指定,之後無法修改,預設的大小為8KB。對於很長的行資料,PG就會啟動TOAST,具體就是採用壓縮和切片的方式。實際資料儲存在另一張系統表的多個行中,這張表就叫TOAST表,這種儲存方式叫行外儲存。
在PG中每個表欄位有四種TOAST的策略,可以參考 
image.png
如圖是一張測試表,interger預設TOAST策略為plain,而text為extended。如果表中有欄位需要TOAST,那麼系統會自動建立一張TOAST表負責行外儲存。(請注意表結構中的oid列無特殊含義,是以前測試所建立的一個列名)

企業微信截圖_16443160716832.png

通過pg_class可以看到tab_ysl這張表的oid為41073,其對應TOAST表的oid為41076
image.png
企業微信截圖_16443131411693.png
則對應的TOAST表為pg_toast.pg_toast_41073(注意TOAST表不在當前schema下,在pg_toast的模式下,以pg_開頭的模式名都是保留給系統使用的)
image.png
可以看到表的實際兩個檔案都存在
image.png
插入測試資料進行測試,可以看到插入一條如圖資料時,TOAST表裡並無記錄。因為name列只有10個字元,所以沒有壓縮,也沒有行外儲存。
image.png
繼續進行測試,每次把name列的長度增長一倍,一直迴圈更新,直到TOAST表裡有記錄。
image.png
image.png
此時可以看到,name的長度為327680,超過了8k的頁面大小,TOAST表裡的兩條記錄長度都是略小於2K,這是因為text型別的extended策略下,先啟用了壓縮,然後才使用行外儲存。
image.png


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2854909/,如需轉載,請註明出處,否則將追究法律責任。

相關文章