PostgreSQL-亂序插入資料導致索引膨脹
在對索引進行重建的時候,發現索引比原來更小。
針對這個現象,進行了如下測試:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C++中泛型使用導致的膨脹問題C++泛型
- Synchronized鎖及其膨脹synchronized
- Zend Studio導致PHP插入資料庫中文亂碼【坑了個爹】PHP資料庫
- Hive資料匯入HBase引起資料膨脹引發的思考Hive
- flink上下游並行度不一致導致的資料亂序問題並行
- 表膨脹的查詢方法
- 4步追蹤導致事務日誌膨脹的SQL命令SQL
- opencv 影像腐蝕、影像的膨脹OpenCV
- [程式設計題] 膨脹的牛牛程式設計
- 膨脹的template class成員函式函式
- 順序表有序插入資料
- MySQL 預插入的資料條數過多導致異常MySql
- 插入資料庫亂碼問題資料庫
- PostgreSQL-資料庫命令SQL資料庫
- [java][鎖]java鎖的膨脹和優化Java優化
- synchronized的實現原理——鎖膨脹過程synchronized
- OpenCV (iOS)中的腐蝕和膨脹(9)OpenCViOS
- INTERVAL分割槽插入大量資料導致ORA-4031錯誤
- 演示字符集不同導致插入,查詢產生亂碼的過程
- 2024年全球主要國家通貨膨脹預測(附原資料表)
- 2025年全球主要國家通貨膨脹預測(附原資料表)
- 當「SPA」應用遇上了膨脹的專案
- opencv中的影象形態學——腐蝕膨脹OpenCV
- 深入分析synchronized原理和鎖膨脹過程(二)synchronized
- 主鍵自增,Insert為0的記錄導致資料混亂
- hibernate插入中文到mysql資料庫亂碼MySql資料庫
- [Python影象處理] 八.影象腐蝕與影象膨脹Python
- IMF:通貨膨脹如何徹底改變經濟理念
- 受通貨膨脹影響最大的支出是什麼?
- RAC環境單獨節點插入資料也會導致全域性等待(二)
- RAC環境單獨節點插入資料也會導致全域性等待(一)
- 使用mybatis-plus,由於表名關鍵字導致插入資料失敗MyBatis
- 多餘索引導致explain錯誤索引AI
- ORACLE 大小寫導致找不到索引Oracle索引
- MySQL 因資料型別轉換導致執行計劃使用低效索引MySql資料型別索引
- MySQL8.0:倒序索引資料的資料排列方式MySql索引
- 我膨脹了,測試必要商城小程式,用了3種方式!:)
- 我膨脹了,測試必要商城小程式,用了 3 種方式!:)