PostgreSQL:表的儲存屬性

Ryan_Bai發表於2020-12-14

TOAST

TOAST 是“The Oversized-Attribute Storage Technique”的縮寫,主要用於儲存一個大欄位的值。

特點

PostgreSQL採用固定頁面大小(通常是8Kb,不象oracle在執行期間有多種選擇),元組不能跨越多個頁面,無法實現“大欄位值“的直接儲存。TOAST 提供瞭解決方法,允許大的欄位值被壓縮或分裂為多個物理行。

postgresql 只為部分資料型別支提供 TOAST 支援,資料型別必須是變長(varlena)的型別。前 32 位儲存著以位元組記的數值總長度(包括長度本身)。

  • 長度字的高 2 bit 位是標誌位,用於標識壓縮與行外儲存

    • 一個表示該數值採用行外儲存,此時只是儲存著一個指標,該指標指向其他的地方。另外30個位表示資料的實際尺寸。

    • 一個表示該數值被壓縮,使用前必須先解壓縮;

  • 後面 30 bit 是長度值:因此“大欄位“的邏輯長度被限制在了1GB(2^30-1)位元組內。

行外儲存

如果一個表中有任何一個欄位是可以 TOAST 的,那麼 PostgreSQL 會自動為該表建一個相關聯的 TOAST 表,其 OID 儲存在表 pg_class.reltoastrelid 記錄裡,行外的內容儲存在 TOAST 表裡

行外資料被分裂成(如果壓縮過,以壓縮後為參考)最多TOAST_MAX_CHUNK_SIZE(這個數值略小於BLCKSZ/4,或者預設 2K位元組)位元組的塊,每個塊都作為獨立的行在 TOAST 表裡為所屬表儲存。每個 TOAST 表都有欄位 chunk_id,chunk_seq 和 chunk_data。在 chunk_id 和 chunk_seq 上有一個唯一索引,提供對數值的快速檢索。

只有表中儲存超過 BLCKSZ/4 位元組(通常是2Kb)的行才會觸發,對欄位進行壓縮和行外儲存,直到小於BLCKSZ/4位元組,或者無法得到更好的結果的時候才停止。UPDATE操作過程中,未改變的欄位的數值通常原樣儲存;因此UPDATE行外儲存的記錄時,如果行外資料值沒有變化,將不會帶來 TOAST 開銷存在。

TOAST 程式碼識別四種不同的儲存可TOAST欄位的策略:

  • PLAIN避免壓縮或者行外儲存。只對那些非TOAST資料型別才有效。

  • EXTENDED允許壓縮和行外儲存。大多數TOAST資料型別的預設值。首先進行壓縮,如果行仍然太大,則進行行外儲存。

  • EXTERNAL允許行外儲存,不許壓縮。使用 EXTERNAL將令那些在 text 和 bytea 欄位上的子字串操作更快(代價是增加了儲存空間),因此這些操作是經過最佳化的:如果行外資料沒有壓縮,那麼它們只抓取需要的部分。

  • MAIN允許壓縮,不允許行外儲存。當資料值壓縮過後仍然太大將會採用行外儲存。每個可以 TOAST 的資料型別都為該資料型別的欄位宣告一個預設策略,但是特定表的欄位的儲存策略可以用ALTER TABLE SET STORAGE修改。

優點

相對直接的儲存方式來說,資料經過 TOAST 方式後,單個或者連續資料塊中能夠儲存更多的資料值,對於訪問非“大欄位”時,能夠大量減少掃描塊數或者物理IO 次數;

對於極少訪問的含“大欄位”記錄,經過手動修改儲存屬性,採用 TOAST 方式,即便值小於 2K 的情況下同樣能夠帶來很好的效果。

針對系統資料訪問特定,靈活的採用 TOAST 儲存策略總能夠為系統帶來效能的提升。

填充因子

fillfactor 為表的填充因子,toast.fillfactor 是這個表中 TOAST 表的填充因子。填充因子是一個從 10 到 100 的整數,表示在插入資料時,在一個資料塊中填充百分之多少的空間後就不再填充了,另一部分空間預留了更新時使用。

HOT

HOT 是 “Heap-Only Tuple” 的縮寫。

pg 在 8.3 中,加入了 hot 技術。使用 hot 技術後,若所有索引屬性都沒有被修改(索引鍵是否修改是在執行時逐行判斷的,因此如果一條update修改了某屬性,但前後值相同則認為沒有修改),且新版本與原來版本存在一個頁面上則不會產生新的索引記錄,因此這些記錄被稱為 hot(heap only tuple)。

hot 會被打上 heap_only_tuple 標誌,而 hot的上一個版本會被打上heap_hot_updated 標誌,然後順著版本鏈向後找,直到遇到 hot 為止。限制 heap_only_tuple 版本與 hot 在同一頁面的目的是為了透過版本鏈向後找時不產生額外的 io 操作從而影響效能。因此,hot 技術消除了擁有完全相同鍵值的索引記錄,減少了索引的大小。

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

相關文章