空間回收
當對數(shù)據(jù)庫執(zhí)行UPDATE或DELETE操作時,雖然數(shù)據(jù)表面上已被刪除,但實際上只是被標記為不可見,并留有"空洞"在數(shù)據(jù)頁中。這會導致在讀取數(shù)據(jù)時,這些"空洞"也會一同被加載,從而減慢了數(shù)據(jù)的掃描速度。因此,您需要定期清理這些已刪除的空間以提高數(shù)據(jù)讀取效率。
AnalyticDB PostgreSQL能夠在后臺自動對表進行臟數(shù)據(jù)回收操作(Auto Vacuum)。具體操作,請參見自動回收空間(Auto Vacuum)。
為了在大量的刪除或更新操作后及時清理表,您也可以針對整個AnalyticDB PostgreSQL數(shù)據(jù)庫或單個表手動執(zhí)行VACUUM 操作。具體操作,請參見維護定期回收空間任務(wù)。
空間回收方法
使用VACUUM
命令,可以對表進行重新整理,回收空間,以便獲取更好的數(shù)據(jù)讀取性能。VACUUM命令如下:
VACUUM [FULL] [FREEZE] [VERBOSE] [table];
VACUUM
:不帶任何參數(shù)時,會對所有表執(zhí)行VACUUM操作。VACUUM [table]
:對單表執(zhí)行VACUUM,清理臟數(shù)據(jù),釋放列存表的臟數(shù)據(jù)空間和行存表尾部的空洞,該操作不會阻塞該表的讀寫。VACUUM FULL [table]
:對單表執(zhí)行VACUUM FULL,會徹底釋放表的臟數(shù)據(jù)空間,但是會請求排他鎖阻塞讀寫。VACUUM FREEZE [table]
:對單表執(zhí)行VACUUM FREEZE,降低單表的XID AGE,不阻塞讀寫。VACUUM VERBOSE [table]
:會打印VACUUM執(zhí)行過程中各節(jié)點回收臟數(shù)據(jù)行數(shù)的日志。
使用建議
AnalyticDB PostgreSQL實例默認開啟Auto Vacuum功能,后臺自動對表進行臟數(shù)據(jù)回收操作和降低XID AGE。
在進行大量刪除與更新操作后,您可以手動執(zhí)行運行VACUUM FULL命令,以徹底地釋放表占用空間。
只有表的主用戶才能執(zhí)行VACUUM操作。如果在沒有相應(yīng)權(quán)限的情況下運行VACUUM,該操作不會產(chǎn)生任何效果。
查詢需要執(zhí)行VACUUM的表
AnalyticDB PostgreSQL提供了智能診斷數(shù)據(jù)膨脹功能,您可以利用該能力找到膨脹的表,按照建議查詢需要執(zhí)行VACUUM的表。具體內(nèi)容,請參見數(shù)據(jù)膨脹診斷。
AnalyticDB PostgreSQL提供了一個gp_bloat_diag視圖,統(tǒng)計當前頁數(shù)和實際需要頁數(shù)的比例。您也可以通過analyze table來收集統(tǒng)計信息之后,查看該視圖。
gpadmin=# SELECT * FROM gp_toolkit.gp_bloat_diag;
bdirelid | bdinspname | bdirelname | bdirelpages | bdiexppages | bdidiag
----------+------------+------------+-------------+-------------+---------------------------------------
21488 | public | t1 | 97 | 1 | significant amount of bloat suspected
(1 row)
結(jié)果只包括發(fā)生了中度或者顯著膨脹的表。當實際頁面和預(yù)期頁面的比率(bdirelpages / bdiexppages)超過4但小于10時,就會報告為中度膨脹。當該比率超過10時就會報告顯著膨脹。對于這些表,可以執(zhí)行VACUUM FULL來回收空間。