Oracle重建索引

创建表

 create table student(
 student_id number,
 name       varchar2(240)
 ) tablespace school_data;

创建索引

create index student_n1 on studen(name);

查看索引具体内容

 SELECT * FROM dba_indexes dbi WHERE dbi.index_name = 'STUDENT_N1';
 --查看具体的列,可以发现tablespace_name,PCTFREE等属性,说明索引也是存储与数据块中的一个具体文件
 
 --插入数据后,段也创建了(因为延迟段)
INSERT INTO student VALUES(101,'ALEX');
COMMIT;
select * from dba_segments dbs where dbs.segment_name = 'STUDENT_N1';

索引的状态

alter index student_n1 unusable;
--再次查看
 SELECT dbi.index_name,
        dbi.status
   FROM dba_indexes dbi
  WHERE dbi.index_name = 'STUDENT_N1';
--索引的状态变为UNUSABLE了
--再次查看段,会发现段已经没有了
 select * from dba_segments dbs where dbs.segment_name = 'STUDENT_N1';
 select * from dba_extents dbe where dbe.segment_name = 'STUDENT_N1';
 --查看区,也发现区也没有了

结论:使索引变为不可以不仅是改变状态而已。

参考资料:当索引不可用(unusable)时,Oracle 内部会把该索引元数据(即创建语句包含的基本信息)与真
是物理数据之间的对应关系断裂,相关数据块可被重用(经过实验,ORACLE 会把索引段删
除,但是 sys 用户索引除外)。索引段是否已创建(dba_indexe_segment_created)这一属性,
会变为 no(正常情况向,应为 yes)。Unusable 索引,想要被重新使用,只有一种方法:rebuild。
当然还可以 drop 再 create

重建索引

alter index student_n1 rebuild;
--重建后可以再次在数据字典中看到了
 select * from dba_segments dbs where dbs.segment_name = 'STUDENT_N1';
 select * from dba_extents dbe where dbe.segment_name = 'STUDENT_N1';

删除索引

drop index student_n1;

除此之外还有两种修改索引状态的语句:

alter index student_n1 disable;
alter index student_n1 enable;

然而我们执行以上语句会报错

SQL> alter index student_n1 disable;
alter index student_n1 disable
*
ERROR at line 1:
ORA-02243: invalid ALTER INDEX or ALTER MATERIALIZED VIEW option

因为该语句只能用于函数索引上

-- 创建函数索引
create index student_name_n1 on student(upper(name));
alter index student_name_n1 disable;

posted on 2022-11-18 10:02  小yq  阅读(2988)  评论(0编辑  收藏  举报

导航