【HAVENT 原創】PostgreSQL 查詢和手動縮表

一、查詢 pgsql 自動清理的歷史統計信息

-- 查詢 pgsql 自動清理的歷史統計信息
SELECT relname                              表名,
       seq_scan                             全表掃描記錄數,
       idx_scan                             索引掃描次數,
       idx_tup_fetch                        索引掃描記錄數,
       n_tup_ins                            插入的條數,
       n_tup_upd                            更新的條數,
       n_tup_del                            刪除的條數,
       n_tup_hot_upd                        熱更新條數,
       n_live_tup                           活動元組估計數,
       n_dead_tup                           死亡元組估計數,
       last_vacuum                          最後一次手動清理時間,
       last_autovacuum                      最後一次自動清理時間,
       last_analyze                         最後一次手動分析時間,
       last_autoanalyze                     最後一次自動分析時間,
       vacuum_count                         手動清理的次數,
       autovacuum_count                     自動清理的次數,
       analyze_count                        手動分析此表的次數,
       autoanalyze_count                    自動分析此表的次數,
       (CASE
            WHEN n_live_tup > 0 THEN n_dead_tup :: float8 / n_live_tup :: float8
            ELSE 0 END) ::NUMERIC(12, 2) AS "死/活元組的比例"
FROM pg_stat_all_tables
WHERE schemaname = 'public'
ORDER BY n_dead_tup::float8 DESC;

二、查詢 psql 當前數據庫表已經達到自動清理條件的表及相關信息

-- 查詢 psql 當前數據庫表已經達到自動清理條件的表及相關信息
SELECT c.relname                                                                           表名,
       (current_setting('autovacuum_analyze_threshold')::NUMERIC(12, 4)) +
       (current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12, 4)) * reltuples AS 自動分析閾值,
       (current_setting('autovacuum_vacuum_threshold')::NUMERIC(12, 4)) +
       (current_setting('autovacuum_vacuum_scale_factor')::NUMERIC(12, 4)) * reltuples  AS 自動清理閾值,
       reltuples::DECIMAL(19, 0)                                                           活元組數,
       n_dead_tup::DECIMAL(19, 0)                                                          死元組數
FROM pg_class c
         LEFT JOIN pg_stat_all_tables d
                   ON C.relname = d.relname
WHERE c.relname LIKE 'tb%'
  AND reltuples > 0
  AND n_dead_tup > (current_setting('autovacuum_analyze_threshold')::NUMERIC(12, 4)) +
                   (current_setting('autovacuum_analyze_scale_factor')::NUMERIC(12, 4)) * reltuples;

三、查詢 pgsql 正在進行自動清理的表及相關信息

-- 查詢 pgsql 正在進行自動清理的表及相關信息
SELECT c.relname           對象名稱,
       l.pid               進程id,
       psa.STATE           查詢狀態,
       psa.query           執行語句,
       now() - query_start 持續時間
FROM pg_locks l
         INNER JOIN pg_stat_activity psa ON (psa.pid = l.pid)
         LEFT OUTER JOIN pg_class C ON (l.relation = C.oid)
WHERE psa.query like 'autovacuum%'
  and l.fastpath = 'f'
ORDER BY query_start asc;

四、查看用例下所有數據庫的磁盤空間佔用情況

-- 查看用例下所有數據庫的磁盤空間佔用情況
SELECT table_schema || '.' || table_name AS table_full_name,
       pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables
ORDER BY pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') desc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章