HGDB索引膨脹的檢查與處理思路

文章目錄

  • 環境
  • 文檔用途
  • 詳細信息

環境

系統平臺:Linux x86-64 Red Hat Enterprise Linux 7
版本:4.5.8

文檔用途

本文檔主要介紹HGDB索引膨脹的定義、產生的原因、如何檢查以及遇到索引膨脹如何處理(包括預防和解決)

詳細信息

索引膨脹的定義

假設對一個索引進行順序的數據插入,那么索引分裂應該只會發生在最右邊的葉子結點;若對索引進行無序的插入,那么中間的葉子結點會進行了分裂,多出了很多空閑空間,索引掃描的時候需要掃描更多的頁,造成了io和存儲空間上的浪費

產生膨脹索引的原因

1、表中的每個行版本(“元組”)都有一個未死亡的索引條目。當 VACUUM 刪除死元組時,它還必須刪除相應的索引條目,這會在索引頁中創建空白空間。此類空間可以重復使用,但如果沒有新條目添加到頁面,則該空間仍為空

2、頻繁更新相同的行,在VACUUM清理老元組前,表和索引會維護相同行的很多版本。若索引頁填滿,HGDB會將索引頁分裂成2個,在VACUUM執行完清理之后,最終會得到2個臃腫的頁面而不是1個

索引膨脹的檢查

提前安裝好pgstattuple插件,用于返回一個關系的物理長度、"死亡"元組的百分比以及其他信息

create extension pgstattuple;

如下查詢用于查看free_space占用前5的索引,空閑空間越大說明索引使用率越低

select oid::regclass,(pgstattuple(oid)).* from pg_class where relkind='i' order by free_space desc limit 5 offset 0;

如下查詢查看具體表中的各個索引大小

select relname, pg_relation_size(oid)/1024 || 'K' AS size from pg_class where relkind='i' and relname='stu_dex';

除了擴展也可以通過如下的sql查看索引膨脹的相關信息(膨脹大小、膨脹率等),便于對膨脹的索引做優化

SELECT current_database(), nspname AS schemaname, tblname, idxname, bs*(relpages)::bigint AS real_size,bs*(relpages-est_pages)::bigint AS extra_size,100 * (relpages-est_pages)::float / relpages AS extra_pct,fillfactor,CASE WHEN relpages > est_pages_ffTHEN bs*(relpages-est_pages_ff)ELSE 0END AS bloat_size,100 * (relpages-est_pages_ff)::float / relpages AS bloat_pct,FROM (SELECT coalesce(1 +ceil(reltuples/floor((bs-pageopqdata-pagehdr)/(4+nulldatahdrwidth)::float)), 0 -- ItemIdData size + computed avg size of a tuple (nulldatahdrwidth)) AS est_pages,coalesce(1 +ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4+nulldatahdrwidth)::float))), 0) AS est_pages_ff,bs, nspname, tblname, idxname, relpages, fillfactor, is_na-- , pgstatindex(idxoid) AS pst, index_tuple_hdr_bm, maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, reltuples -- (DEBUG INFO)FROM (SELECT maxalign, bs, nspname, tblname, idxname, reltuples, relpages, idxoid, fillfactor,( index_tuple_hdr_bm +maxalign - CASE -- Add padding to the index tuple header to align on MAXALIGNWHEN index_tuple_hdr_bm%maxalign = 0 THEN maxalignELSE index_tuple_hdr_bm%maxalignEND+ nulldatawidth + maxalign - CASE -- Add padding to the data to align on MAXALIGNWHEN nulldatawidth = 0 THEN 0WHEN nulldatawidth::integer%maxalign = 0 THEN maxalignELSE nulldatawidth::integer%maxalignEND)::numeric AS nulldatahdrwidth, pagehdr, pageopqdata, is_na-- , index_tuple_hdr_bm, nulldatawidth -- (DEBUG INFO)FROM (SELECT n.nspname, i.tblname, i.idxname, i.reltuples, i.relpages,i.idxoid, i.fillfactor, current_setting('block_size')::numeric AS bs,CASE -- MAXALIGN: 4 on 32bits, 8 on 64bits (and mingw32 ?)WHEN version() ~ 'mingw32' OR version() ~ '64-bit|x86_64|ppc64|ia64|amd64' THEN 8ELSE 4END AS maxalign,/* per page header, fixed size: 20 for 7.X, 24 for others */24 AS pagehdr,/* per page btree opaque data */16 AS pageopqdata,/* per tuple header: add IndexAttributeBitMapData if some cols are null-able */CASE WHEN max(coalesce(s.null_frac,0)) = 0THEN 8 -- IndexTupleData sizeELSE 8 + (( 32 + 8 - 1 ) / 8) -- IndexTupleData size + IndexAttributeBitMapData size ( max num filed per index + 8 - 1 /8)END AS index_tuple_hdr_bm,/* data len: we remove null values save space using it fractionnal part from stats */sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 1024)) AS nulldatawidth,max( CASE WHEN i.atttypid = 'pg_catalog.name'::regtype THEN 1 ELSE 0 END ) > 0 AS is_naFROM (SELECT ct.relname AS tblname, ct.relnamespace, ic.idxname, ic.attpos, ic.indkey, ic.indkey[ic.attpos], ic.reltuples, ic.relpages, ic.tbloid, ic.idxoid, ic.fillfactor,coalesce(a1.attnum, a2.attnum) AS attnum, coalesce(a1.attname, a2.attname) AS attname, coalesce(a1.atttypid, a2.atttypid) AS atttypid,CASE WHEN a1.attnum IS NULLTHEN ic.idxnameELSE ct.relnameEND AS attrelnameFROM (SELECT idxname, reltuples, relpages, tbloid, idxoid, fillfactor, indkey,pg_catalog.generate_series(1,indnatts) AS attposFROM (SELECT ci.relname AS idxname, ci.reltuples, ci.relpages, i.indrelid AS tbloid,i.indexrelid AS idxoid,coalesce(substring(array_to_string(ci.reloptions, ' ')from 'fillfactor=([0-9]+)')::smallint, 90) AS fillfactor,i.indnatts,pg_catalog.string_to_array(pg_catalog.textin(pg_catalog.int2vectorout(i.indkey)),' ')::int[] AS indkeyFROM pg_catalog.pg_index iJOIN pg_catalog.pg_class ci ON ci.oid = i.indexrelidWHERE ci.relam=(SELECT oid FROM pg_am WHERE amname = 'btree')AND ci.relpages > 0) AS idx_data) AS icJOIN pg_catalog.pg_class ct ON ct.oid = ic.tbloidLEFT JOIN pg_catalog.pg_attribute a1 ONic.indkey[ic.attpos] <> 0AND a1.attrelid = ic.tbloidAND a1.attnum = ic.indkey[ic.attpos]LEFT JOIN pg_catalog.pg_attribute a2 ONic.indkey[ic.attpos] = 0AND a2.attrelid = ic.idxoidAND a2.attnum = ic.attpos) iJOIN pg_catalog.pg_namespace n ON n.oid = i.relnamespaceJOIN pg_catalog.pg_stats s ON s.schemaname = n.nspnameAND s.tablename = i.attrelnameAND s.attname = i.attnameGROUP BY 1,2,3,4,5,6,7,8,9,10,11) AS rows_data_stats) AS rows_hdr_pdg_stats) AS relation_statsORDER BY nspname, tblname, idxname;

預防索引膨脹

實例級

vacuum命令運行的最小延遲:

alter system set autovacuum_naptime=15s;

在一個表上觸發vacuum的被插入、被更新或被刪除元組的最小數量:

alter system set autovacuum_vacuum_threshold=25;

在一個表上觸發analyze的被插入、被更新或被刪除元組的最小數量:

alter system set autovacuum_analyze_threshold=10;

決定是否觸發vaccum時作為一個分數將它加到autovacuum_vacuum_threshold上:

alter system set autovacuum_vacuum_scale_factor=0.01;

決定是否觸發analyze時作為一個分數將它加到autovacuum_vacuum_threshold上:

alter system set autovacuum_analyze_scale_factor=0.05;

autovacuum觸發條件:

pg_stat_all_tables.n_dead_tup大于 autovacuum_vacuum_threshold + pg_class.reltuples * autovacuum_vacuum_scale_factor

autoananlyze觸發條件:

pg_stat_all_tables.n_mod_since_analyze大于 autovacuum_analyze_threshold + pg_class.reltuples * autovacuum_analyze_scale_factor

表級

1、設置合適的autovacuum_vacuum_scale_factor,大表如果頻繁的有更新或刪除和插入操作, 建議設置較小的autovacuum_vacuum_scale_factor來降低空間的浪費,加快對表的vacuum操作頻率

對更新頻繁的表,單獨調整

alter table tablename set (autovacuum_vacuum_scale_factor=0.05);

2、設置表的fillfactor,對頻繁更新的表,調低fillfactor參數:

alter table tablename set (fillfactor=85);

解決索引膨脹

1、重建索引

創建新索引 create index CONCURRENTLY new_index ;

刪除舊索引 drop index old_index ;

或者

重建索引 reindex index 索引名稱 CONCURRENTLY ;

analyze tablename;

2、執行vacuum full

"完全"清理,這樣可以恢復更多的空間,但是花的時間更多并且在表上施加了排它鎖

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81057.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81057.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81057.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python CGI編程】

Python CGI&#xff08;通用網關接口&#xff09;編程是早期Web開發中實現動態網頁的技術方案。以下是系統化指南&#xff0c;包含核心概念、實現步驟及安全實踐&#xff1a; 一、CGI 基礎概念 1. 工作原理 瀏覽器請求 → Web服務器&#xff08;如Apache&#xff09; → 執行…

數據庫故障排查指南:從入門到精通

1. 常見數據庫故障類型 1.1 連接故障 數據庫連接超時連接池耗盡網絡連接中斷認證失敗1.2 性能故障 查詢執行緩慢內存使用過高CPU使用率異常磁盤I/O瓶頸1.3 數據故障 數據不一致數據丟失數據損壞事務失敗2. 故障排查流程 2.1 初步診斷 -- 檢查數據庫狀態SHOW STATUS;SHOW PRO…

conda創建環境常用命令(個人用)

創建環境 conda create --name your_project_name創建環境 ---- 指定環境python版本 conda create --name your_project_name python3.x環境列表 conda env list激活環境 conda activate your_project_name退出環境 conda deactivate環境列表 #使用conda命令 conda list …

PCL 繪制二次曲面

文章目錄 一、簡介二、實現代碼三、實現效果一、簡介 這里基于二次曲面的公式: z = a 0 + a 1 x + a 2 y + a

一文講透面向對象編程OOP特點及應用場景

面向對象編程&#xff08;Object-Oriented Programming, OOP&#xff09;是一種以對象為核心、通過類組織代碼的編程范式。它通過模擬現實世界的實體和交互來構建軟件系統&#xff0c;是現代軟件開發中最廣泛使用的范式之一。以下是 OOP 的全面解析&#xff1a; 一、OOP 的四大…

linux,我啟動一個springboot項目, 用java -jar xxx.jar ,但是沒多久這個java進程就會自動關掉

當使用 java -jar xxx.jar & 啟動 Spring Boot 項目后進程自動關閉時&#xff0c;可能由多種原因導致。以下是常見排查步驟和解決方案&#xff1a; 一、查看日志定位原因 進程異常關閉通常會在控制臺或日志中留下線索&#xff0c;建議先獲取完整日志&#xff1a; 1. 查看…

【獨家精簡】win11(24h2)清爽加速版

自作該版本的初心&#xff1a;隨著電腦性能的不斷提升&#xff0c;我們需要的更多的是沒有廣告&#xff0c;沒有推薦&#xff0c;沒有收集隱私的windows清爽版純凈系統 目前只會去制作windows系統專業版 1、去除Windows系統自帶的廣告新聞和推薦以及小組間和聊天功能。 2、精簡…

大二java第一面小廠(掛)

第一場&#xff1a; mybatis怎么防止數據轉義。 Hutool用的那些你常用的方法。 springboot的常用注解。 redis的多級緩存。 websocket怎么實現的多人協作編輯功能。 怎么實現的分庫分表。 mysql里面的各種操作&#xff0c;比如說分表怎么分&#xff0c;分頁查詢怎么用。 mybat…

OceanBase 的系統變量、配置項和用戶變量有何差異

在繼續閱讀本文之前&#xff0c;大家不妨先思考一下&#xff0c;數據庫中“系統變量”、“用戶變量”以及“配置項”這三者之間有何不同。如果感到有些模糊&#xff0c;那么本文將是您理清這些概念的好幫手。 很多用戶在使用OceanBase數據庫中的“配置項”和“系統變量”&#…

HTML-3.3 表格布局(學校官網簡易布局實例)

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在HBuilder中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 系列文章目錄 HTML-1.1 文本字體樣式-字體設置、分割線、段落標簽、段內回車以及特殊符號 HTML…

如何在Edge瀏覽器里-安裝夢精靈AI提示詞管理工具

方案一&#xff08;應用中心安裝-推薦&#xff09;&#xff1a; 夢精靈 跨平臺AI提示詞管理工具 - Microsoft Edge AddonsMake Microsoft Edge your own with extensions that help you personalize the browser and be more productive.https://microsoftedge.microsoft.com…

GpuGeek 網絡加速:破解 AI 開發中的 “最后一公里” 瓶頸

摘要&#xff1a; 網絡延遲在AI開發中常被忽視&#xff0c;卻嚴重影響效率。GpuGeek通過技術創新&#xff0c;提供學術資源訪問和跨國數據交互的加速服務&#xff0c;助力開發者突破瓶頸。 目錄 一、引言&#xff1a;當算力不再稀缺&#xff0c;網絡瓶頸如何破局&#xff1f; …

校園社區小程序源碼解析

基于ThinkPHP、FastAdmin和UniApp開發的校園社區小程序源碼&#xff0c;旨在為校園內的學生和教職員工提供一個便捷的在線交流和服務平臺。 該小程序前端采用UniApp進行開發&#xff0c;具有良好的跨平臺兼容性&#xff0c;可以輕松發布到iOS和Android平臺。同時&#xff0c;后…

【Elasticsearch】flattened`類型在查詢嵌套數組時可能返回不準確結果的情況

好的&#xff01;為了更清楚地說明flattened類型在查詢嵌套數組時可能返回不準確結果的情況&#xff0c;我們可以通過一個具體的例子來展示。這個例子將展示如何在文檔中沒有完全匹配的嵌套對象時&#xff0c;flattened類型仍然可能返回該文檔。 示例文檔結構 假設你有以下文…

【目標檢測】RT-DETR

DETRs Beat YOLOs on Real-time Object Detection DETR在實時目標檢測任務中超越YOLO CVPR 2024 代碼地址 論文地址 0.論文摘要 YOLO系列因其在速度與精度間的均衡權衡&#xff0c;已成為實時目標檢測領域最受歡迎的框架。然而我們觀察到&#xff0c;非極大值抑制&#xf…

筆試強訓:Day5

一、笨小猴&#xff08;哈希數學&#xff09; 笨小猴_牛客題霸_牛客網 #include <iostream> #include <cmath> using namespace std; string s; bool isprime(int x){//試除法if(x2) return true;if(x<2||x%20) return false;int nsqrt(x);for(int i3;i<n;i…

掌握 LangChain 文檔處理核心:Document Loaders 與 Text Splitters 全解析

&#x1f407;明明跟你說過&#xff1a;個人主頁 &#x1f3c5;個人專欄&#xff1a;《深度探秘&#xff1a;AI界的007》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目錄 一、引言 1、什么是LangChain 2、LangChain 在智能應用中的作用 …

開發工具指南

后端運維場用工具 工具文檔簡介1panel安裝指南運維管理面板網盤功能介紹網盤jenkins可以通過1panel 進行安裝jpom輔助安裝文檔后端項目發布工具

拷貝構造函數如果不加引用會怎樣?

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1…

UE5中制作動態數字Decal

在進行城市道路編輯時&#xff0c;經常需要繪制人行道、交通標志、停車線等路面元素。如果能夠使用具有動態修改功能的 Decal&#xff08;貼花&#xff09;&#xff0c;將大大提升編輯效率和靈活性。接下來講解如何制作。 1.首先準備一張包含所需元素的Texture&#xff0c;這里…