PostgreSQL-亂序插入資料導致索引膨脹

T1YSL發表於2021-07-17

在對索引進行重建的時候,發現索引比原來更小。
針對這個現象,進行了如下測試:
1.資料庫版本為PostgreSQL12.1

[postgres@ysla ~]$ postgres --version
postgres (PostgreSQL) 12.1

2.先建表t1_ysl和索引ind_l,之後按亂序插入數值

postgres=# create table t1_ysl(id int);
CREATE TABLE
postgres=# create index ind_l on t1_ysl(id);
CREATE INDEX
postgres=# insert into t1_ysl select random()*10000000 from generate_series(1,10000000);
INSERT 0 10000000

//插入10000000個1-10000000之間的隨機整數

postgres=# \di+
                         List of relations
Schema | Name  | Type  |  Owner   | Table  |  Size  | Description
--------+-------+-------+----------+--------+--------+-------------
public | ind_l | index | postgres | t1_ysl | 284 MB |
(1 row)

重建索引後,檢視索引大小,索引佔用明顯下降

postgres=# reindex index ind_l ;
REINDEX
postgres=# \di+
                         List of relations
Schema | Name  | Type  |  Owner   | Table  |  Size  | Description
--------+-------+-------+----------+--------+--------+-------------
public | ind_l | index | postgres | t1_ysl | 214 MB |
(1 row)

3.清除資料,先建立索引,並順序寫入資料

postgres=# truncate t1_ysl ;
TRUNCATE TABLE
postgres=# \di+
                           List of relations
Schema | Name  | Type  |  Owner   | Table  |    Size    | Description
--------+-------+-------+----------+--------+------------+-------------
public | ind_l | index | postgres | t1_ysl | 8192 bytes |
(1 row)
postgres=# insert into t1_ysl select generate_series(1,10000000);  
INSERT 0 10000000

//順序插入1-10000000的數值

postgres=# \di+
                         List of relations
Schema | Name  | Type  |  Owner   | Table  |  Size  | Description
--------+-------+-------+----------+--------+--------+-------------
public | ind_l | index | postgres | t1_ysl | 214 MB |
(1 row)

4.先順序寫入資料,後建立索引

postgres=# create index ind_l on t1_ysl(id);
CREATE INDEX
postgres=# \di+
                         List of relations
Schema | Name  | Type  |  Owner   | Table  |  Size  | Description
--------+-------+-------+----------+--------+--------+-------------
public | ind_l | index | postgres | t1_ysl | 214 MB |
(1 row)

現象:順序寫入時,索引大小和後建索引大小一致,沒有出現膨脹。資料亂序寫入時,索引明顯佔用更大的空間。
結論:索引頁裡的資料是有序的,索引欄位亂序寫入,導致索引頻繁分裂,使得索引頁沒有被完全被佔用。最終導致索引膨脹。
處理方法:重建索引。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2781886/,如需轉載,請註明出處,否則將追究法律責任。

相關文章