--有一些时候发现某些表的索引大小会超出表的大小,而且索引字段比表字段少很多,
怀疑是对表的更新导致。
--测试索引比表大的情况
create table t_index(id ,name,owner,type) as select object_id , object_name,owner,object_type from dba_objects;
create index idx_t on t_index(id , name);
SQL> create index idx_t on t_index(id , name);
Index created
SQL>
SELECT SEGMENT_NAME,BYTES,BLOCKS FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('T_INDEX','IDX_T') ;
SEGMENT_NAME BYTES BLOCKS
-------------------------------------------------------------------------------- ---------- ----------
IDX_T 6291456 768
T_INDEX 8388608 1024
begin
for x in 1..100000
loop update t_index set id=id+0.1 where id=x;
end loop;
end;
/
PL/SQL procedure successfully completed
SQL> commit;
SQL> ANALYZE INDEX IDX_T VALIDATE STRUCTURE ;
Index analyzed
SQL> analyze table T_INDEX compute statistics;
Table analyzed
SQL> analyze index idx_t compute statistics;
Index analyzed
SQL>
SQL> SELECT SEGMENT_NAME,BYTES,BLOCKS FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('T_INDEX','IDX_T') ;
SEGMENT_NAME BYTES BLOCKS
---------------------------------------- ---------- ----------
T_INDEX 8388608 1024
IDX_T 10485760 1280
SQL>
SQL> alter index idx_t rebuild;
Index altered
SQL> SELECT SEGMENT_NAME,BYTES,BLOCKS FROM USER_SEGMENTS WHERE SEGMENT_NAME IN ('T_INDEX','IDX_T') ;
SEGMENT_NAME BYTES BLOCKS
---------------------------------------- ---------- ----------
T_INDEX 8388608 1024
IDX_T 6291456 768
SQL>
--结果:当数据update操作频繁,对index的维护会导致其占用空间过大,通过rebuild可以恢复到原始状态。
本文通过实验演示了在频繁更新操作下,数据库表的索引可能会出现膨胀现象,导致索引大小超过表本身的情况。文章提供了具体的SQL示例来创建表、建立索引并进行更新操作,展示了索引膨胀的过程及通过rebuild操作来恢复索引到正常状态的方法。
795

被折叠的 条评论
为什么被折叠?



