PostgreSQL:表的儲存屬性
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 非易失性儲存器NV-SRAM的關鍵屬性
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- 作用域、連結屬性和儲存型別型別
- 11 線性表的順序儲存結構
- 線性表的順序儲存C++程式碼C++
- 線性表之順序儲存結構
- 線性表之鏈式儲存結構
- PostgreSQL DBA(60) - 列式儲存zedstoreSQLZed
- 線性表的順序儲存C++程式碼實現C++
- PostgreSQL/Lightdb 更改列屬性語法SQL
- PostgreSQL儲存引擎之page結構SQL儲存引擎
- LightDB/PostgreSQL 相容Oracle儲存過程SQLOracle儲存過程
- 飛機大戰中rect屬性儲存小數值解釋
- 表屬性設定
- css屬性與js中style物件的屬性對應表CSSJS物件
- 訊息資料庫Message DB:PostgreSQL的事件儲存和訊息儲存 - Eventide Blog資料庫SQL事件IDE
- Web APIs-07:本地儲存 + 移動端開發框架 + classList屬性WebAPI框架
- PostgreSQL儲存引擎之heap tuple結構SQL儲存引擎
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 域控安全-EventID 4662&Powershell將Schema下Objects的schemaIDGUID屬性離線儲存ObjectAIGUI
- 線性表的順序儲存-順序表,對“突然的自我”的否定,對自我的揚棄
- 【譯】表單元件的屬性相容性表元件
- PostgreSQL DBA(123) - 列式儲存zedstore再體驗SQLZed
- Innodb 下null '' ' '的儲存表現的不同Null
- 在 Kubernetes 上快速測試 Citus 分散式 PostgreSQL 叢集(分散式表,共置,引用表,列儲存)分散式SQL
- 讀取和儲存Excel表Excel
- zabbix5.0之postgresql表分割槽操作詳情(儲存過程、定時任務)SQL儲存過程
- 006.OpenShift永續性儲存
- 非易失性儲存器EEPROM
- 易失性儲存DRAM詳解
- 物件儲存服務的完整性檢查物件
- 共有的表單欄位屬性
- 線性結構(順序儲存和鏈式儲存)和非線性結構的特點及區別
- innodb表空間儲存結構
- 達夢列儲存表(HUGE Table)
- 報表資料分庫儲存
- 動態表單儲存設計
- MySQL的nnodb引擎表資料分割槽儲存MySql