========================================================================================================
索引rebuild案例总结
========================================================================================================
公司平时用到分区表较多,根据年月的复合分区表,每到年末需要做分区扩展,这其中索引(包括普通索引、分区索引)rebuild过程必不可少,结合实践加总结研究,本贴就将索引重建案例总结分享出来。
(1)普通B-Tree索引:
普通索引在user_indexes查询status,状态(valid:有效;unusable:失效,N/A:分区索引有效),注意,要查询分区索引有效与否,需要查询另外的表,请参见接下来的内容:
索引重建SQL:alter index index_name rebuild pararllel 4 nologging;
--注意:这里的并行,可以不加,如果有条件有需要可根据实际情况设置.
(2)分区索引:
-->>查询分区索引是全局分区索引还是本地分区索引,取决于user_part_indexes中locality字段:全局分区索引(LOCAL),本地分区索引(GLOBAL);
-->>由于全局分区索引要么全部USABLE,要么全部UNUSABLE[分区表索引状态也就只有那两种].所以一般不rebuild,便捷的方法是先drop再create.这里主要以本地分区索引为主:
A1.本地单分区索引
--->>查询分区信息在user_ind_partitions表中查询,复合分区索引状态在这里显示的是N/A,若要确定子分区索引状态在user_ind_subpartitions中查询.
--->>重建分区索引SQL:
Alter index index_name rebuild partition partition_name pararllel 4 nologging;
A2.本地复合分区索引:
查询分区信息在user_ind_subpartitions表中查询:
--->>重建子分区索引SQL:
Alter index index_name rebuild subpartition subpartition_name pararllel 4 nologging;
(3注意事项:
这里只是针对schema级别查询,用的都是user_*,当然也可以DBA级别,dba_*;
还有需要注意的是本地复合分区表如果某一分区下多个子分区索引失效,不能简单rebuild该一级分区,而需要逐个rebuild子分区,其实这应该是分区索引的优点所在。
(4)友情分享:
将上面本类索引批量rebuild小编整理了个存储过程,内容如下,多指正哈:
------------------------------------------------------------------------------------------------------------------------------------->>
create or replace PACKAGE BODY "DAWN_BATCH_REBUILD_INDEX" is
S_SQL VARCHAR2(500);
ACCOUNT_normal NUMBER := 0;
ACCOUNT_partition NUMBER := 0;
ACCOUNT_subpartition NUMBER := 0;
--normal index rebuild
procedure normal_index_rebuild AS
begin
FOR LINE2 IN (select t4.index_name,t4.tablespace_name from user_indexes t4 where t4.status='UNUSABLE')LOOP
S_SQL := 'alter index ' || LINE2.INDEX_NAME || ' rebuild tablespace '||LINE2.TABLESPACE_NAME||' pararllel 4 nologging';
DBMS_OUTPUT.PUT_LINE(S_SQL);
ACCOUNT_normal := ACCOUNT_normal + 1;
EXECUTE IMMEDIATE S_SQL;
END LOOP;
DBMS_OUTPUT.PUT_LINE('normal index rebuild numbers:'||ACCOUNT_normal);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END normal_index_rebuild;
--partition index rebuild
procedure partition_index_rebuild AS
begin
FOR LINE2 IN (select t2.index_name,t2.partition_name,t2.tablespace_name from user_ind_partitions t2
where t2.subpartition_count=0 and t2.status='UNUSABLE')LOOP
S_SQL := 'alter index '|| LINE2.INDEX_NAME || ' rebuild partition '||line2.partition_name||' tablespace '||LINE2.TABLESPACE_NAME||' pararllel 4 nologging';
DBMS_OUTPUT.PUT_LINE(S_SQL);
ACCOUNT_partition := ACCOUNT_partition + 1;
EXECUTE IMMEDIATE S_SQL;
END LOOP;
DBMS_OUTPUT.PUT_LINE('partition index rebuild numbers:'||ACCOUNT_partition);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END partition_index_rebuild;
--subpartition index rebuild
procedure subpartition_index_rebuild AS
begin
FOR LINE2 IN (select t3.index_name,t3.tablespace_name,t3.partition_name,t3.subpartition_name,t3.status
from user_ind_subpartitions t3 where t3.status='UNUSABLE')LOOP
S_SQL := 'alter index ' || LINE2.INDEX_NAME || ' rebuild subpartition '||line2.subpartition_name ||' tablespace '||LINE2.TABLESPACE_NAME||'pararllel 4';
DBMS_OUTPUT.PUT_LINE(S_SQL);
ACCOUNT_subpartition := ACCOUNT_subpartition + 1;
EXECUTE IMMEDIATE S_SQL;
END LOOP;
DBMS_OUTPUT.PUT_LINE('subpartition index rebuild numbers:'||ACCOUNT_subpartition);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END subpartition_index_rebuild;
end DAWN_BATCH_REBUILD_INDEX;
------->>最后若想了解关于分区表种类操作对分区表的不同影响请参见:http://blog.itpub.net/29119536/viewspace-1145136/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29119536/viewspace-1215725/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29119536/viewspace-1215725/