在11gr2中,对于不可用索引,Oracle会自动将对应的数据段释放,避免不可用的索引占用空间。
首先看看10g下的情况:
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bi
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
SQL> CREATE TABLE T_INDEX
2 AS SELECT * FROM DBA_OBJECTS;
Table created.
SQL> CREATE INDEX IND_T_INDEX_NAME
2 ON T_INDEX(OBJECT_NAME);
Index created.
SQL> SELECT SEGMENT_NAME, BYTES/1024
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'IND_T_INDEX_NAME';
SEGMENT_NAME BYTES/1024
------------------------------ ----------
IND_T_INDEX_NAME 3072
SQL> ALTER INDEX IND_T_INDEX_NAME UNUSABLE;
Index altered.
SQL> SELECT SEGMENT_NAME, BYTES/1024
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'IND_T_INDEX_NAME';
SEGMENT_NAME BYTES/1024
------------------------------ ----------
IND_T_INDEX_NAME 3072
即使索引被置于不可用状态,索引段仍然存在。
下面看看11gr2环境下的情况:
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
SQL> CREATE TABLE T_INDEX
2 AS SELECT * FROM DBA_OBJECTS;
表已创建。
SQL> CREATE INDEX IND_T_INDEX_NAME
2 ON T_INDEX(OBJECT_NAME);
索引已创建。
SQL> SELECT SEGMENT_NAME, BYTES/1024
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'IND_T_INDEX_NAME';
SEGMENT_NAME BYTES/1024
------------------------------ ----------
IND_T_INDEX_NAME 3072
SQL> ALTER INDEX IND_T_INDEX_NAME UNUSABLE;
索引已更改。
SQL> SELECT SEGMENT_NAME, BYTES/1024
2 FROM USER_SEGMENTS
3 WHERE SEGMENT_NAME = 'IND_T_INDEX_NAME';
未选定行
正如文章开头介绍的,在11.2中,如果索引被至于UNUSABLE状态,则数据库会自动将索引对应的段释放,避免不可用的索引还占有数据文件空间。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-624776/ ,如需转载,请注明出处,否则将追究法律责任。