云原生數據倉庫AnalyticDB PostgreSQL版能夠在后臺對表自動進行臟數據回收操作,避免數據持續膨脹導致掃描性能下降以及XID回卷問題,本文介紹Auto Vacuum工作機制及調優參數。
前提條件
云原生數據倉庫AnalyticDB PostgreSQL版實例的版本為2021年05月27日及以上。如何升級小版本,請參見版本升級。
工作機制
Auto Vacuum可以自動執行VACUUM或者VACUUM FREEZE命令。Auto Vacuum進程會定期檢查具有大量插入、更新或刪除的表,以及每張表的XID AGE,在需要的時候主動對表執行VACUUM或VACUUM FREEZE操作,回收表中的垃圾數據或者降低XID AGE,提升查詢速度。
觸發公式
臟數據行數 > 表行數 * 觸發比例閾值 + 觸發行數閾值
臟數據在表進行更新刪除時會累計,表行數為該表上次進行分析時得到的行數統計信息,觸發比例閾值受autovacuum_vacuum_scale_factor參數控制,默認為0.5,觸發行數閾值受autovacuum_vacuum_threshold參數控制,默認為10000行。即默認情況下您可以認為:當表中臟數據比例超過一半時,自動臟數據清理會觸發。
鎖沖突
Auto Vacuum會持有表的四級鎖。當Auto Vacuum工作期間,如果業務需要持有的鎖與Auto Vacuum獲取的鎖沖突,Auto Vacuum進程會主動退讓鎖,不影響業務執行。
資源占用
Auto Vacuum在執行時會占用一定CPU和IO資源,但在業務沒有觸及資源瓶頸時不會對性能有影響。
查詢Auto Vacuum進程工作情況
在AnalyticDB PostgreSQL 7.0版中,可以通過如下的SQL查看正在工作的Auto Vacuum進程。
SELECT * FROM pg_stat_activity WHERE backend_type = 'autovacuum worker';
在AnalyticDB PostgreSQL 6.0版中,可以通過如下的SQL查看正在工作的Auto Vacuum進程。
SELECT * FROM pg_stat_activity WHERE query LIKE 'autovacuum%';
查詢Auto Vacuum執行VACUUM的表
SELECT schemaname, c.relname, c.reltuples, n_dead_tup, last_autovacuum, (n_dead_tup::float / c.reltuples::float)
AS bloat_ratio FROM pg_stat_all_tables s, pg_class c
WHERE c.oid = s.relid AND c.reltuples > 10000 AND (n_dead_tup::float > 10000 + c.reltuples::float * 0.5)
ORDER BY (n_dead_tup::float/ c.reltuples::float) DESC;
參數說明:
0.5:實例autovacuum_vacuum_scale_factor的參數值。
10000:實例autovacuum_vacuum_threshold的參數值。
參數設置
實例級別參數
如下所示為支持調整的實例級別參數。
參數名稱 | 參數含義 | 默認值 |
autovacuum_naptime | auto vacuum進程調度周期,單位為秒。 | 60 |
autovacuum_vacuum_scale_factor | auto vacuum觸發的比例閾值。若您希望回收臟數據的頻率更高,可以通過調低比例閾值實現。 | 0.5 |
autovacuum_vacuum_threshold | auto vacuum觸發的行數閾值。 | 10000 |
autovacuum_freeze_max_age | auto vacuum觸發VACUUM FREEZE的XID AGE閾值。 | 200,000,000 |
autovacuum_max_execute_workers | auto vacuum允許執行的并行數。 | max(3, cpucores/2), cpucores為單計算節點CPU核數。 |
一般不建議調整實例級別的Auto Vacuum參數,如果想要調整某個參數閾值,可以提交工單聯系工程師調整。
表級別參數
調整Auto Vacuum參數
您可以只針對某張表調整Auto Vacuum參數,語法如下。
ALTER TABLE <test_table> SET (<autovaccum_options>=<expect_value>);
參數說明:
<test_table>
:需要調整的表名。<autovaccum_options>
:可以調整的Auto Vacuum表級別參數。<expect_value>
:想要調整的值。
使用示例
示例一:關閉表test的Auto Vacuum。
ALTER TABLE test SET (autovacuum_enabled=false);
autovacuum_enabled=false
會關閉表的Auto Analyze能力,建議通過調高觸發比例關閉Auto Vacuum。
示例二:調高表test Auto Vacuum的觸發比例到80%。
ALTER TABLE test SET (autovacuum_vacuum_scale_factor=0.8);
還原Auto Vacuum參數
您也可以還原某張表的Auto Vacuum參數為實例默認值,語法如下。
ALTER TABLE <test_table> RESET (<autovaccum_options>);
使用示例
示例一:還原表test Auto Vacuum的觸發比例為默認值。
ALTER TABLE test RESET (autovacuum_vacuum_scale_factor);
支持調整的表級別參數
參數名稱 | 參數含義 |
autovacuum_vacuum_scale_factor | auto vacuum觸發的比例閾值。 |
autovacuum_vacuum_threshold | auto vacuum觸發的行數閾值。 |