龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 数据库类 > Oracle 技术 >

oracle重建索引的实现

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
oracle重建索引是我们经常会用到的操作,下面就将为您详细介绍 oracle 重建索引的实现方法,希望对您能够有所帮助。 oracle重建索引有多种方式,如drop and re-create、rebuild、rebuild online等

oracle重建索引是我们经常会用到的操作,下面就将为您详细介绍oracle重建索引的实现方法,希望对您能够有所帮助。

oracle重建索引有多种方式,如drop and re-create、rebuild、rebuild online等。下面简单比较这几种方式异同以及优缺点:

首先建立测试表及数据:

  1. SQL> CREATE TABLE TEST AS SELECT CITYCODE C1 FROM CITIZENINFO2;  
  2.  
  3. Table created  
  4.  
  5. SQL> ALTER TABLE TEST MODIFY C1 NOT NULL;  
  6.  
  7. Table altered  
  8.  
  9. SQL> SELECT COUNT(1) FROM TEST;  
  10.  
  11. COUNT(1)  
  12. ----------  
  13. 16000000  
  14.  

一、drop and re-create和rebuild

首先看看正常建立索引时,对表的加锁情况。

  1. suk@ORACLE9I> @show_sid  
  2.  
  3. SID  
  4. ----------  
  5. 14  
  6.  
  7. suk@ORACLE9I> CREATE INDEX IDX_TEST_C1 ON TEST(C1);  

索引已创建。

  1. SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;  
  2.  
  3. OBJECT_NAME LMODE  
  4. ------------------------------ ----------  
  5. OBJ$ 3  
  6. TEST 4  

可见,普通情况下建立索引时,oracle会对基表加share锁,由于share锁和 row-X是不兼容的,也就是说,在建立索引期间,无法对基表进行DML操作。

对于删除重建索引的方法就不介绍了,它与上面的描述是一样的,下面我们看看用rebuild的方式建立索引有什么特别。

  1. suk@ORACLE9I> ALTER INDEX IDX_TEST_C1 REBUILD; 

索引已更改。

另开一个会话,查询此时test的加锁情况:

  1. SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=14;  
  2.  
  3. OBJECT_NAME LMODE  
  4. ------------------------------ ----------  
  5. TEST 4  

可见,rebuild的方式对基表的加锁方式与CREATE时是一样的。

另开一个会话,在索引正在rebuild时,执行如下SQL:

  1. suk@ORACLE9I> SET AUTOTRACE TRACE  
  2. suk@ORACLE9I> SELECT /*+ INDEX(TEST) */ COUNT(1) FROM TEST WHERE ROWNUM<10

执行计划

  1. ----------------------------------------------------------  
  2. SELECT STATEMENT Optimizer=CHOOSE (Cost=26 Card=1)  
  3. 0 SORT (AGGREGATE)  
  4. 1 COUNT (STOPKEY)  
  5. 2 INDEX (FULL SCAN) OF 'IDX_TEST_C1' (NON-UNIQUE) (Cost=  
  6. 26 Card=1986621

可以看到oracle重建索引时,查询仍然可以使用旧索引。实际上,oracle在rebuild时,在创建新索引过程中,并不会删除旧索引,直到新索引rebuild成功。

从这点可以知道rebuild比删除重建的一个好处是不会影响原有的SQL查询,但也正由于此,用rebuild方式建立索引需要相应表空间的空闲空间是删除重建方式的2倍。
 

利用替换变量提高Oracle交互性

ORACLE系统表和数据字典视图

带您了解Oracle文件系统机制

详解四大类Oracle索引扫描

Oracle查询重复记录的三种方法

精彩图集

赞助商链接