com.操操|h视频在线观看免费网站|亚洲国产成人在线|国精产品999免费|A片级片免费播放

當前位置: fuhua-pet->認證 > PostgreSQL技術大講堂 - 第24講:TOAST技術

PostgreSQL技術大講堂 - 第24講:TOAST技術

2023-08-02作者:firstyuding來源:www.lgjxsb.com

PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內容包括對PG基礎的認知、包括安裝使用、包括角色權限、包括維護管理、、等內容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續關注CUUG PG技術大講堂。

第24講:TOAST技術

內容1 : Toast簡介

內容2 : Toast的存儲方式

內容3 : Toast4種壓縮策略

內容4 : Toast表的計算方式

內容5 : Toast表的優點與缺點

內容6 : 與Oracle大對象存儲方式對比


Toast簡介

· Toast技術產生背景

元組不允許跨頁面存儲

· TOST技術特點

Toast是超長字段在PG的一個存儲方式

全稱The OverSized Attribute Storage Technique(超尺寸字段存儲技術)

它會將大字段值壓縮或者分散為多個物理行來存儲

對于用戶來說不用關注這一技術實現,完全是透明的


Toast的存儲方式

· PG的部分類型數據支持toast,因為有些字段類型是不會產生大字段數據(比如date,time,boolean等)

· 支持Toast的數據類型應當是可變長度的(variable-length)

· 表中任何一個字段有Toast,這個表都會有這一個相關聯的Toast表,OID被存儲在pg_class.reltoastrelid里

· 超出的的數值將會被分割成chunks,并且最多toast_max_chunk_size 個byte(缺省是2KB)

· 當存儲的列長度超過toast_tuple_threshold值(通常是2KB),就會觸發toast存儲

· toast將會壓縮或者移動字段值直到超出部分比toast_tuple_targer值小(這個值通常也是2KB)。


建表時自動創建Toast表

--創建表

create table toast_t(id int,vname varchar(48),remark text);

--其中remak數據類型是text,列值長度超過2KB則就會自動產生toast表來存儲。


更改表的存儲方式為Toast

語法:

ALTER TABLE toast_t ALTER COLUMN vname

SET STORAGE {PLAIN | EXTENDED | MAIN | EXTERNAL};

示例:

create table toast_t1(dd character varying);

alter table toast_t1 alter column dd set storage main;


/d+ toast_1

Column | Type | Storage |

--------+-----+---------+-

dd | character varying | main |

Access method: heap


查看Toast表的名字

--查看tost表的oid

testdb=# select relname,relfilenode,reltoastrelid from pg_class where relname='toast_t1';

relname | relfilenode | reltoastrelid

----------+-------------+---------------

toast_t1 | 16385 | 16389

--根據tost表oid查看其名字

testdb=# select relname from pg_class where oid = '16389';

relname

----------------

pg_toast_16385


Toast4種策略

策略:PLAIN

說明:避免壓縮和行外存儲。

只有那些不需要 TOAST 策略就能存放的數據類型允許選擇(例如 int 類型),而對于 text 這類要求存儲長度超過頁大小的類型,是不允許采用此策略的。

策略:MAIN

說明:允許壓縮,但不許行外存儲。

不過實際上,為了保證過大數據的存儲,行外存儲在其它方式(例如壓縮)都無法滿足需求的情況下,作為最后手段還是會被啟動。因此理解為盡量不使用行外存儲更貼切。

策略:EXTENDED

說明:允許行外存儲和壓縮。

一般會先壓縮,如果還是太大,就會行外存儲

策略:EXTERNA

說明:允許行外存儲,但不許壓縮。

類似字符串這種會對數據的一部分進行操作的字段,采用此策略可能獲得更高的性能,因為不需要讀取出整行數據再解壓。


Toast表額外的三個字段

字段名:chunk_id

屬性:標識TOAST表的OID字段

字段名:chunk_seq

屬性:chunk的序列號,與chunk_id的組合唯一索引可以加速訪問

字段名:chunk_data

屬性:存儲TOAST表的實際數據

--查看tost表oid

testdb=# select relname,oid,rreltoastrelid from pg_class where relname='toast_t1';

relname | relfilenode | reltoastrelid

----------+-------------+---------------

toast_t1 | 16385 | 16389

--查看tost表結構,tost表屬于pg_tost模式

testdb=# \d+ pg_toast.pg_toast_16385

Column | Type | Storage

------------+---------+---------

chunk_id | oid | plain

chunk_seq | integer | plain

chunk_data | bytea | plain


Toast表的計算

計算一個表的大小時要注意統計Toast的大小,因為對超長字段存儲時,在基礎表上可能只存了20%,另外的數據都存到了Toast里面去了,計算大小時要結合起來看

索引也是一樣,對于表里有extended或者EXTERNA 類型的會創建Toast表,兩者的關聯是通過pg_class里的OID去關聯的


· Toast表的計算案例(一)

testdb=# create table toast_t(id int,vname varchar(48),remark text);

CREATE TABLE

testdb=# select relname,oid from pg_class where relname = 'toast_t';

relname | oid

---------+-------

toast_t | 16392

testdb=# select relname,reltoastrelid from pg_class where relname = 'toast_t';

relname | reltoastrelid

---------+---------------

toast_t | 16395

testdb=# select relname from pg_class where oid = '16395';

relname

----------------

pg_toast_16392


· Toast表的計算案例(二)

--插入數據,此時remark列值長度小于2KB,所以不會觸發tost存儲:

insert into toast_t

select generate_series(1,4),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',2000);

--查看表中列值大小:

testdb=# select pg_column_size(id),pg_column_size(vname),pg_column_size(remark) from toast_t limit 10;

pg_column_size | pg_column_size | pg_column_size

----------------+----------------+----------------

4 | 29 | 851

4 | 29 | 851

4 | 29 | 851

4 | 29 | 851


· Toast表的計算案例(三)

--查看基礎表和 Toast 的大小

testdb=# select pg_size_pretty(pg_relation_size('toast_t'));

pg_size_pretty

----------------

8192 bytes

--查看tost表尺寸

testdb=# select pg_size_pretty(pg_relation_size('16395'));

pg_size_pretty

----------------

0 bytes

此時remark列值長度小于2KB,所以不會觸發tost存儲。


· Toast表的計算案例(四)

--remark列值超過 2kb 左右時觸發了tost存儲方式

insert into toast_t select generate_series(3,4),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',5500);

testdb=# select pg_size_pretty(pg_relation_size('16395'));

pg_size_pretty

----------------

8192 bytes


· Toast表的計算案例(五)

--查看各列的數據變化,說明在列尺寸超過2k的時候就會把數據存放到toast表中:

testdb=# select pg_column_size(id),pg_column_size(vname),pg_column_size(remark) from toast_t;

pg_column_size | pg_column_size | pg_column_size

----------------+----------------+----------------

4 | 29 | 851

4 | 29 | 851

4 | 29 | 851

4 | 29 | 851

4 | 29 | 1651

4 | 29 | 1651

4 | 29 | 2247

4 | 29 | 2247


· Toast表的計算案例(六)

--繼續插入更多的數據:

insert into toast_t select generate_series(1,2),repeat('kenyon here'||'^_^',2),repeat('^_^ Kenyon is not God,Remark here!!',10000);

--查看toast表大小:

testdb=# select pg_size_pretty(pg_relation_size('16395'));

pg_size_pretty

----------------

16 kB

--繼續插入更多的數據,20000

可以看到后插入的數據隨著字段內容的增多,toast 段一直在變大。基礎表的大小沒有變化。這個和 Oracle 存儲的大字段內容比較像,Oracle 存儲 Blob和clob 類的數據時也是指定另外的 segment 來存儲,而不是在原表中存儲,當然可以設置 enable storage in row 來指定表中存儲


Toast表的優點

1.可以存儲超長超大字段,避免之前不能直接存儲的限制

2.物理上與普通表是分離的,檢索查詢時不檢索到該字段會極大地加快速度

3.更新普通表時,該表的Toast數據沒有被更新時,不用去更新Toast表


Toast表的缺點

1.對大字段的索引創建是一個問題,有可能會失敗,通常不建議在大字段上創建,全文檢索是一個解決方案

2.大字段的更新會有點慢,其它DB也存在相同問題


Oracle大對象段存儲特點

11g版本中推出了針對 LOB字段處理的新技術:SecureFiles

該技術在性能、可管理性、易用性等方面,具有如下具體特點和優勢:

· 提供數據去重、壓縮和透明加密功能

· SecureFiles不僅可以有效降低LOB字段存儲空間消耗,提高了訪問效率,而且提高了LOB字段的數據安全性。


以上述某系統為例,我們將其中一個100GB的LOB字段轉換為SecureFiles,并采用壓縮技術之后,最終只消耗30GB空間,大大壓縮了存儲空間。

·新的網絡協議

SecureFiles提供一種新的Client/Server方式的內部讀寫機制,有效提高了大量數據傳輸的效率。

· 簡化物理屬性設計和管理

SecureFiles提供了大量自動化的物理屬性機制,免去了大量物理屬性設計和管理工作。例如:CHUNK屬性為可變長,最大能支持到64M;Oracle能自動進行碎片整理;

· SecureFiles還自動進行redo和undo的管理,避免大量不必要的redo和 undo信息的產生。


以上就是【PostgreSQL從小白到專家】第24講 - TOAST技術  的內容,歡迎一起探討交流釘釘交流群:35,82,24,60,往期視頻及文檔內容聯系CUUG

  • 神舟通用數據庫
  • 實時數倉 Hologres
  • 天翼云數據庫TeleDB
  • 圖數據庫gStore
  • 星瑞格SinoDB數據庫管理系統
  • 虛谷xugudb數據庫
  • 云和恩墨MogDB數據庫
  • PostgreSQL 18 測試版Beta 1 發布,新功能新特性!
  • PostgreSQL技術大講堂 - 第89講:重講數據庫完全恢復
  • PostgreSQL技術大講堂 - 第90講:重講數據庫不完全恢復
  • PostgreSQL證書有效期是幾年
  • 學PostgreSQL技術,考工信部人才交流中心PG認證證書
  • OCP認證指南:學什么內容、考什么內容
  • 2025年5月30日證書,恭喜CUUG張同學通過OCM19c認證
  • CUUG入選2025年首批IITC工信人才崗位能力評價業務信息技術應用創新領域合作機構
  • PostgreSQL技術大講堂 - 第92講:重講流復制原理
  • 河北建筑工程學院與北京優技教育(CUUG)達成產教整合校企合作
  • 推薦哪一家PostgreSQL認證?來看看工信部直屬人才交流中心的PG認證
  • 信創PostgreSQL培訓考試認證中心 -- 工信部人才交流中心唯一指定
  • 6月6日證書 - 工信部人才交流中心PostgreSQL中級PGCP高級PGCM認證
  • PostgreSQL從入門到精通教程- 第93講:重講pg流復制安裝部署
  • PostgreSQL認證怎么選?PGCP中級認證PGCM高級認證
  • PostgreSQL數據庫培訓+認證+考試 - 工業和信息化部人才交流中心
  • 騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(PostgreSQL版)
  • 騰訊云TCCP認證考試報名 - TDSQL數據庫交付運維高級工程師(MySQL版)
  • 騰訊云TCCP認證考試報名 - TDSQL數據庫交付運維高級工程師(PostgreSQL版)
  • OCM考試多少分及格?看看CUUG 張同學Oracle 19c OCM成績單
  • 2025年5月安同學PostgreSQL PGCP中級認證證書
  • 高校信創數據庫人才培養創新與變革暨天職師大數據庫教學平臺國產化替代院長峰會
  • 六六大順!2025年6月6日李同學OCP 19c認證證書
  • Apache HBase數據庫
  • IBM Informix數據庫
  • MySQL 8.0 OCP認證考試題庫持續更新
  • 海若向量數據庫HaiRuo VectorDB
  • 瀚高數據庫HIGHGO
  • 鴻蒙PC正式發布,有望加速數據庫國產化進程
  • 巨杉數據庫SequoiaDB
  • 萬里數據庫GreatDB
  • PostgreSQL 17.5、16.9、15.13、14.18 和 13.21 發布!
  • 2025年5月陳同學PostgreSQL PGCP中級認證證書
  • 2025年5月份工信部人才交流中心PostgreSQL認證證書
  • 2025年5月胡同學PostgreSQL PGCP中級認證證書
  • 2025年5月李同學PostgreSQL PGCM高級認證證書
  • 2025年5月李同學PostgreSQL PGCP中級認證證書
  • 2025年5月王同學PostgreSQL PGCP中級認證證書
  • 2025年5月趙同學PostgreSQL PGCM高級認證證書
  • PostgreSQL技術大講堂 - 第91講:重講表空間恢復
  • PostgreSQL認證培訓考試中心,及證書查詢網址
  • PostgreSQL相比Oracle有哪些優勢
  • 騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(MySQL版)