|
如果你知道某个表的insert/update/delete都比较频繁,那么这个表的索引隔段时间就需要进行rebuild,但如果你新接手一个系统的维护与管理,对表的DML频率并不清楚,那如何决定是否对这个表的索引进行rebuild呢?
其实有一个非常简单的方法,就是看索引的pct_used值,如果它的值小于75%,那这个索引就需要进行rebuild,因为索引默认的pct_used值是90%. select index_name,pct_free from user_indexes where index_name='&1'; 10:24:29 SQL> analyze index PK_PMSG_INBOX_PMSG_ID validate structure; Index analyzed. Elapsed: 00:00:06.29 10:25:16 SQL> exec print_table('select * from index_stats'); HEIGHT : 3 BLOCKS : 7040 NAME : PK_PMSG_INBOX_PMSG_ID PARTITION_NAME : LF_ROWS : 1276592 LF_BLKS : 6942 LF_ROWS_LEN : 19734902 LF_BLK_LEN : 3988 BR_ROWS : 6941 BR_BLKS : 12 BR_ROWS_LEN : 79519 BR_BLK_LEN : 8028 DEL_LF_ROWS : 296973 DEL_LF_ROWS_LEN : 4637327 DISTINCT_KEYS : 1276592 MOST_REPEATED_KEY : 1 BTREE_SPACE : 27781032 USED_SPACE : 19814421 PCT_USED : 72 ROWS_PER_KEY : 1 BLKS_GETS_PER_ACCESS : 4 PRE_ROWS : 0 PRE_ROWS_LEN : 0 OPT_CMPR_COUNT : 0 OPT_CMPR_PCTSAVE : 0 ----------------- PL/SQL procedure successfully completed. Elapsed: 00:00:00.03 10:25:32 SQL> alter index PK_PMSG_INBOX_PMSG_ID rebuild; Index altered. Elapsed: 00:00:03.05 10:27:34 SQL> analyze index PK_PMSG_INBOX_PMSG_ID validate structure; Index analyzed. Elapsed: 00:00:01.34 10:27:39 SQL> exec print_table('select * from index_stats'); HEIGHT : 3 BLOCKS : 2176 NAME : PK_PMSG_INBOX_PMSG_ID PARTITION_NAME : LF_ROWS : 979692 LF_BLKS : 2105 LF_ROWS_LEN : 15098742 LF_BLK_LEN : 7996 BR_ROWS : 2104 BR_BLKS : 4 BR_ROWS_LEN : 24022 BR_BLK_LEN : 8028 DEL_LF_ROWS : 0 DEL_LF_ROWS_LEN : 0 DISTINCT_KEYS : 979692 MOST_REPEATED_KEY : 1 BTREE_SPACE : 16863692 USED_SPACE : 15122764 PCT_USED : 90 ROWS_PER_KEY : 1 BLKS_GETS_PER_ACCESS : 4 PRE_ROWS : 0 PRE_ROWS_LEN : 0 OPT_CMPR_COUNT : 0 OPT_CMPR_PCTSAVE : 0 ----------------- PL/SQL procedure successfully completed. 当索引的pct_used小于75%后,索引的rebuild后,branch blocks与leaf blocks都大大减少,当然索引的性能就有了较大的提高.
|