pg attribute表容量膨脹問題分析

2021-07-07 08:18:05 字數 3355 閱讀 2102

1)test資料庫下已有一張class表,資訊如下,包含兩個欄位int型別的num和varchar(20)型別的name:

test=# \d class

資料表 "public.class"

字段 | 型別 | 修飾詞

------+-----------------------+--------

num | integer | 非空

name | character varying(20) |

2)檢視此時儲存在pg_attribute表中class表的字段資訊,結果如下:

test=# select attrelid,attname from pg_attribute a, pg_class b where a.attrelid=b.oid and b.relname='class';

-[ record

1 ]------

attrelid | 35012

attname | cmax

-[ record

2 ]------

attrelid | 35012

attname | cmin

-[ record

3 ]------

attrelid | 35012

attname | ctid

-[ record

4 ]------

attrelid | 35012

attname | name

-[ record

5 ]------

attrelid | 35012

attname | num

-[ record

6 ]------

attrelid | 35012

attname | tableoid

-[ record

7 ]------

attrelid | 35012

attname | xmax

-[ record

8 ]------

attrelid | 35012

attname | xmin

從結果中看到pg_attribute表中儲存著class表的8個字段,除了自己定義的num和name之外,其他6個位預設隱含字段。

3)如果更新了class表的乙個字段,更新後的字段資訊會儲存到pg_attribute表,舊的字段資訊將被標記為刪除狀態,成為dead資料。在更新class表字段之前,先查詢出當前pg_attribute表的live和dead記錄,查詢結果如下:

test=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';

-[ record 1 ]------------

relname | pg_attribute

n_live_tup | 2428

n_dead_tup | 257

可以看到,目前pg_attribute表的live記錄為2428,dead記錄為257;

4)現在更新class表的name欄位名稱,然後再次查詢pg_attribute表的live記錄和dead記錄,結果如下:

test=# alter

table class rename column name to name2;

alter

table

test=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';

-[ record 1 ]------------

relname | pg_attribute

n_live_tup | 2428

n_dead_tup | 258

可以看到,在把class表的name欄位名稱更新為name2後,pg_attribute表的live記錄未變化,dead記錄由257變為258,說明pg_attribute中多了一條dead記錄,這條記錄就是被更新的name欄位。

5)現在測試建立和刪除臨時表對pg_attribute表的影響,先建立乙個臨時表:

test=# create temp table tempt(

test(# id int);

create

table

test=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';

-[ record 1 ]------------

relname | pg_attribute

n_live_tup | 2435

n_dead_tup | 258

建立臨時表tempt,只包含乙個int型別的id欄位。建立後查詢pg_attribute資訊,可以看到live記錄由2428變為了2435,增長了7,結合步驟2)中實驗得出的每張表預設包含6個隱藏字段,剛好此處增長的7個字段為tempt表的字段。

6)刪除臨時表tempt,刪除後檢視pg_attribute表資訊:

test=# drop

table tempt;

drop

table

test=# select relname, n_live_tup,n_dead_tup from pg_stat_sys_tables a where a.relname='pg_attribute';

-[ record 1 ]------------

relname | pg_attribute

n_live_tup | 2428

n_dead_tup | 265

刪除後,可以看到live記錄重新變回了2428,而dead記錄變為了265,相比258增長了7。這增長的7條dead記錄即為tempt臨時表中的7個字段資訊。

所以如果頻繁的用到臨時表,需要注意pg_attribute表的dead空間清理。可以使用vacuum操作或者cluster操作是否dead空間。

即vacuum full tablename。

cluster tablename using index。

mysql單錶容量 MySQL單錶容量有多少

mysql單錶容量在500萬左右,效能處於最佳狀態,此時mysql的btree索引樹高在3到5之間 而單錶最大限已經不再由mysql限制了,改為電腦容量限制了。mysql單錶容量 mysql 單錶容量在500萬左右,效能處於最佳狀態,此時,mysql 的 btree 索引樹高在3 5之間。mysql...

oracle 檢視資料表容量大小

1.檢視所有表,每張表占用大小 單位是byte 2.檢視其中幾張表大小 需要再加判斷條件 segment name 表名 還有一些查詢需要dba許可權,諸如表空間大小等等 檢視所有表的資料量並排序 select t.table name,t.num rows from user tables t o...

MySQL檢視資料庫表容量大小

select table schema as 資料庫 sum table rows as 記錄數 sum truncate data length 1024 1024,2 as 資料容量 mb sum truncate index length 1024 1024,2 as 索引容量 mb from...