当在一个有大量记录的表上创建索引时这个时间可能会很长,我做了一个实验,在SUN的工作站上对一个有八百多万行的表创建索引要20分钟左右。
SQL>set timing on
SQL> create index ind_sub_obj on subscribeinfo(OBJECTID);
Index created.
Elapsed: 00:20:44.50
那么有什么办法来加速索引的创建呢?索引的创建过程实质是一个创建B+树的过程,这个过程中一个重要的阶段就是做排序操作,
如果我们把更多的排序过程放在内存中完成会大大地加速索引的创建。
下面的例子通过调整数据库的pga_aggregate_target参数来达到加速索引创建的过程。
SQL> alter system set pga_aggregate_target =100000000;
System altered.
SQL> create index ind_sub_obj on subscribeinfo(OBJECTID);
Index created.
Elapsed: 00:09:20.91
上述操作的时间由20分钟变为9分钟,大家应该欣喜若狂了吧,但还可能做得更快些。
Oracle的默认规则是所有对数据块的改变都会记录到日志中,如果我们不使用这个规则将可以更快一些。
下面的例子用nologging选项告诉oracle不要写日志,这个时间由9分钟减到了6分钟。
SQL> create index ind_sub_obj on subscribeinfo(OBJECTID) nologging;
Index created.
Elapsed: 00:06:40.16
是不是还可以快些呢?当然可以,如果一个机器上有多个CPU的话,这个操作将进一步加速,具体的SQL如下
--n为cpu的个数
create index ind_sub_obj on subscribeinfo(OBJECTID) nologging
parallel (degree n)