大數據就業實戰培訓 Oracle就業實戰培訓
PostgreSQL從小白到專家,是從入門逐漸能力提升的一個系列教程,內容包括對PG基礎的認知、包括安裝使用、包括角色權限、包括維護管理、、等內容,希望對熱愛PG、學習PG的同學們有幫助,歡迎持續關注CUUG PG技術大講堂。
Part 17:Vacuum空間管理工具
內容1:VACUUM 概述
內容2:可見性地圖作用
內容3:凍結處理
內容4:Autovacuum daemon
內容5:Full VACUUM
VACUUM概述
· VACUUM概述Vacuum處理對數據庫中的指定表或所有表執行以下任務:
1、移除死元組
刪除死元組并對每個頁面的活元組進行碎片整理。
刪除指向死元組的索引元組。
2、冷凍老的Txid
必要時凍結老元組的Txid 更新凍結的與系統目錄(pg_database和pg_class)相關的txid
如有可能,移除clog中不必要的部分
3、其他
更新已處理表的FSM和VM。
更新幾個統計數據(pg_stat_all_tables等)
VACUUM處理流程
· VACUUM 處理流程
(1) 從指定的表中獲取每個表。
(2) 獲取表的ShareUpdateExclusiveLock鎖。此鎖允許讀取其他事務。
(3) 掃描所有頁面以獲取所有死元組,必要時凍結舊元組。
(4) 如果存在,則移除指向相應死元組的索引元組。
(5) 對表的每一頁執行以下步驟(6)和(7)。
(6) 移除死元組并重新分配頁面中的活元組。
(7) 更新目標表的相應FSM和VM。
(8) 如果最后一頁沒有元組,則截斷最后一頁u003c/p>
(9) 更新與目標表的真空處理相關的統計信息和系統目錄。
(10) 更新與真空處理相關的統計數據和系統目錄。
(11) 如果可能的話,刪除不必要的文件和clog的頁面
· 第一步
執行凍結處理并刪除指向死元組的索引元組
1、掃描目標表,創建死元組列表
2、通過死元組列表刪除索引元組,即“清理階段”
3、如此循環,直到清完為止
· 清理操作流程
· 第二步
更新與每個目標表的真空處理相關的統計信息和系統目錄。
此外,如果最后一頁沒有元組,則從表文件中將其截斷。
如果可能的話,它會刪除不必要的clog部分
可見性地圖
· 提高vacuum的效率
可見性地圖用來記錄含有被刪除行的數據塊id,以提供給vacuum參考。
凍結處理
· 凍結處理流程
凍結處理有兩種模式:
lazy mode(惰性模式)
eager mode(急切模式)
刪除不需要的clog文件
· 刪除clog文件
Autovacuum Daemon
· Autovacuum 守護進程
默認每分鐘執行一次,由autovacuum_naptime參數定義。
默認調用三個worker進程進行工作,由autovacuum_max_workers參數定義。
Full VACUUM
· Full VACUUM
· Full VACUUM 處理流程
什么時候需要FULL VACUUM?
testdb=# CREATE EXTENSION pg_freespacemap;
CREATE EXTENSION
testdb=# SELECT count(*) as "number of pages",
pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
FROM pg_freespace('accounts');
number of pages | Av. freespace size | Av. freespace ratio
-----------------+--------------------+---------------------
1640 | 99 bytes | 1.21
FULL VACUUM示例(一)
testdb=# DELETE FROM accounts WHERE aid %10 != 0 OR aid < 100;
DELETE 90009
testdb=# VACUUM accounts;
VACUUM
testdb=# SELECT count(*) as "number of pages",
pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
FROM pg_freespace('accounts');
number of pages | Av. freespace size | Av. freespace ratio
-----------------+--------------------+---------------------
1640 | 7124 bytes | 86.97
(1 row)
FULL VACUUM示例(二)
testdb=# SELECT *, round(100 * avail/8192 ,2) as "freespace ratio"
FROM pg_freespace('accounts');
blkno | avail | freespace ratio
-------+-------+-----------------
0 | 7904 | 96.00
1 | 7520 | 91.00
2 | 7136 | 87.00
3 | 7136 | 87.00
4 | 7136 | 87.00
5 | 7136 | 87.00
FULL VACUUM示例(三)
testdb=# VACUUM FULL accounts;
VACUUM
testdb=# SELECT count(*) as "number of blocks",
pg_size_pretty(cast(avg(avail) as bigint)) as "Av. freespace size",
round(100 * avg(avail)/8192 ,2) as "Av. freespace ratio"
FROM pg_freespace('accounts');
number of pages | Av. freespace size | Av. freespace ratio
-----------------+--------------------+---------------------
164 | 0 bytes | 0.00
(1 row)
以上就是Part 17 - Vacuum空間管理工具 的內容,歡迎進群一起探討交流QQ交流群:752027153微信交流群:聯系客服拉你進微信PG交流群釘釘交流群:35822460,釘釘群專門有視頻講解