有很多应用场景需要往里灌大量的数据,为提高速度,常常的方法就是失效索引,下面就介绍一下方法。以失效表的索引为例,如果需要失效某个用户下所有的索引,则去掉where条件table_name=‘TEST_TABLE’。
–数据量
select count() from “SYSDBA”.“TEST_TABLE”;–100000000
CREATE INDEX “IDX_WYB_NAME” ON “SYSDBA”.“TEST_TABLE”(“NAME” ASC) STORAGE(ON “TEST.DBF”, CLUSTERBTR) ;
CREATE INDEX “IDX_WYB_PRIPID” ON “SYSDBA”.“TEST_TABLE”(“PRIPID” ASC) STORAGE(ON “TEST.DBF”, CLUSTERBTR) ;
–失效索引
declare
v_cnt int;
begin
for rec in(select INDEX_NAME from user_indexes where table_name=‘TEST_TABLE’ and INDEX_TYPE=‘NORMAL’ and UNIQUENESS=‘NONUNIQUE’)
loop
execute immediate ‘ALTER INDEX “SYSDBA”.’||rec.INDEX_NAME||’ UNUSABLE;’;
end loop;
end;
/
–执行成功, 执行耗时12毫秒
select count() from “SYSDBA”.“TEST_TABLE”;–100000000
–重建索引
–1、REBUILD
declare
v_cnt int;
begin
for rec in(select INDEX_NAME from user_indexes where table_name=‘TEST_TABLE’ and INDEX_TYPE=‘NORMAL’ and UNIQUENESS=‘NONUNIQUE’)
loop
execute immediate ‘ALTER INDEX “SYSDBA”.’||rec.INDEX_NAME||’ REBUILD;’;
end loop;
end;
/
–执行成功, 执行耗时6分 23秒 239毫秒
–2、REBUILD ONLINE
declare
v_cnt int;
begin
for rec in(select INDEX_NAME from user_indexes where table_name=‘TEST_TABLE’ and INDEX_TYPE=‘NORMAL’ and UNIQUENESS=‘NONUNIQUE’)
loop
execute immediate ‘ALTER INDEX “SYSDBA”.’||rec.INDEX_NAME||’ REBUILD ONLINE;’;
end loop;
end;
/
–执行成功, 执行耗时6分 1秒 450毫秒
–2、更新列统计信息
stat 100 on TEST_TABLE(PRIPID);
–执行成功, 执行耗时1分 15秒 279毫秒
stat 100 on TEST_TABLE(NAME);
–执行成功, 执行耗时28秒 773毫秒