1、postgresql中索引系統視圖pg_stat_user_indexes
TEST=# \d+ sys_stat_user_indexes
View "SYS_CATALOG.sys_stat_user_indexes"
Column | Type | Modifiers | Storage | Description
---------------+--------+-----------+---------+-------------
relid | OID | | plain |
indexrelid | OID | | plain |
schemaname | NAME | | plain |
relname | NAME | | plain |
indexrelname | NAME | | plain |
idx_scan | BIGINT | | plain |
idx_tup_read | BIGINT | | plain |
idx_tup_fetch | BIGINT | | plain |
View definition:
SELECT sys_stat_all_indexes.relid,
sys_stat_all_indexes.indexrelid,
sys_stat_all_indexes.schemaname,
sys_stat_all_indexes.relname,
sys_stat_all_indexes.indexrelname,
sys_stat_all_indexes.idx_scan,
sys_stat_all_indexes.idx_tup_read,
sys_stat_all_indexes.idx_tup_fetch
FROM sys_stat_all_indexes
WHERE (sys_stat_all_indexes.schemaname <> ALL (ARRAY['SYS_CATALOG'::NAME, 'INFORMATION_SCHEMA'::NAME])) AND sys_stat_all_indexes.schemaname !~ '^SYS_TOAST'::TEXT;
2、pg_stat_user_indexes中column含義
test=# select *from pg_stat_user_indexes;
-[ RECORD 1 ]-+----------
relid | 16447 #相關表的oid
indexrelid | 16450 #索引的oid
schemaname | public #模式名
relname | t3 #表名
indexrelname | t3_id_idx #索引名
idx_scan | 0 #通過索引掃描的次數,如果該值很小,說明該索引很少被用到,可以考慮刪除
idx_tup_read | 0 #通過任意索引方法返回的索引行數
idx_tup_fetch | 0 #通過索引方法返回的數據行數
3、查看所有表的索引使用情況
select relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch from sys_stat_user_indexes order by idx_scan asc, idx_tup_read asc, idx_tup_fetch asc;
4、查看某張表索引使用情況
select relname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch from sys_stat_user_indexes where relname = 't1' order by idx_scan asc, idx_tup_read asc, idx_tup_read asc, idx_tup_fetch asc;
5、修復損壞索引
通過pg_dump驗證到底是索引塊還是表塊損壞,因為pg_dump不使用索引,直接從表中獲取數據。
驗證故障現象
通過全表訪問數據
set enable_indexscan =‘off’;
explain analzye select * from 表對象
通過索引訪問數據
explain analzye select * from 表對象
a、rebuild index --該方式會鎖表,DML和select都會被鎖,需要根據實際業務申請維護時間
b、rebuild index concurrently --postgresl12才的功能
c、create index concurrently --並發創建索引,會使表的插入更新操作變慢,但不會鎖表(推薦使用該方法)