postgresql清理表空間
# 前言
最近在用postgresql查詢數(shù)據(jù)的時候,發(fā)現(xiàn)有個表的查詢一直很慢,這里暫且取名A表,但是數(shù)據(jù)量并沒有特別大,才幾萬的數(shù)據(jù)量,而且發(fā)現(xiàn)跟這個表同schema的數(shù)據(jù)表有個幾千萬的,但是查詢都比這個A表快很多。后來查找了一系列資料發(fā)現(xiàn),是A表占用的空間太大,會影響查詢的性能,使用命令查看發(fā)現(xiàn)大概有4G左右的磁盤查勇,而幾千萬的那個表占用空間才幾百M(fèi),于是使用命令清理了A表的磁盤占用,處理完之后就幾十M的空間,而且查詢變得很快。
# 處理步驟
## 1.查看表占用空間大小
pg里面查看表空間大小有好幾種方式,如下:
### 1.1 \dt+ 命令
這是 psql 命令行中的命令,可以列出所有表及其大小信息, 如:
```
?postgres=# \dt+ t1
? ? ? ? ? ? ?List of relations
?Schema |? ?Name? ?| Type |? Owner? | Size | Description?
?--------+--------------+-------+-----------+-------+-------------
?public | t1? ? ? | table | postgres | 16 MB |?
```
### 1.2 pg_total_relation_size() 函數(shù)
這個函數(shù)可以直接查詢一個表的大小,如:
```
?sql
?SELECT pg_total_relation_size('t1');
```
### 1.3 pg_size_pretty() 函數(shù)
這個函數(shù)可以將字節(jié)大小轉(zhuǎn)換為人類比較方便閱讀的模式:
```
?sql
?SELECT pg_size_pretty(pg_total_relation_size('t1'));
?輸出:
?16MB
```
?
?
## 2.清理磁盤空間
?VACUUM FULL 是 PostgreSQL 中的一個命令,用于對表進(jìn)行完整的垃圾回收和碎片整理。
?VACUUM FULL 命令會做以下操作:
### 2.1 完整回收未使用的空間
普通的 VACUUM 命令只會回收此刻可以回收的空間,但有些空間必須等到事務(wù)結(jié)束才可以回收。VACUUM FULL 會等待所有事務(wù)結(jié)束,徹底回收所有未使用空間。
###2.2 重寫表數(shù)據(jù)
VACUUM FULL 會重寫表中的每一行,整理存儲碎片,壓縮表空間。
### 2.3 重建索引
VACUUM FULL 會重建表所有的索引,整理索引碎片并壓縮索引空間。
###2.4 更新統(tǒng)計(jì)信息
VACUUM FULL 會重新計(jì)算表的統(tǒng)計(jì)信息, 包括行數(shù)、空間大小等。
###2.5 清理回滾段
VACUUM FULL 會縮小和清空回滾段,釋放更多空間。
**注:使用VACUUM FULL或者VACUUM不會鎖表**
?所以VACUUM FULL 應(yīng)該謹(jǐn)慎執(zhí)行, 最好是業(yè)務(wù)比較空間的時候執(zhí)行,一般建議每隔幾個月執(zhí)行一次。
# 總結(jié)
1.數(shù)據(jù)表在頻繁的更新,寫入,刪除等操作會產(chǎn)生大量的磁盤碎片導(dǎo)致性能下降,使用VACUUM或者VACUUM FULL可以清理掉多余的空間
2.不過要注意因?yàn)閂ACUUM FULL本身清理也會有較大的性能消耗,而且會鎖表,所以使用的時候要謹(jǐn)慎,不要在業(yè)務(wù)頻繁調(diào)用的時候清理