ORACLE数据库:如何重建索引。

【问题描述】
大部分情况下,ORACLE数据库的索引,并不需要人为干预,但若表在短时间内大幅删除数据,致使表出现大量的空块,可以考虑重建其索引,
【解决方案】
1 使用SQLPLUS工具(建议),以业务账号身份登录,建辅助表:
CREATE TABLE USER_INDEX_STATS
(ANALYZED_DATE DATE DEFAULT SYSDATE,
REBUILD_DATE DATE,
TABLE_NAME VARCHAR2(30),
INDEX_NAME VARCHAR2(30),
HEIGHT NUMBER,
BLOCKS NUMBER,
PARTITION_NAME VARCHAR2(30),
LF_ROWS NUMBER,
LF_BLKS NUMBER,
LF_ROWS_LEN NUMBER,
LF_BLK_LEN NUMBER,
BR_ROWS NUMBER,
BR_BLKS NUMBER,
BR_ROWS_LEN NUMBER,
BR_BLK_LEN NUMBER,
DEL_LF_ROWS NUMBER,
DEL_LF_ROWS_LEN NUMBER,
DISTINCT_KEYS NUMBER,
MOST_REPEATED_KEY NUMBER,
BTREE_SPACE NUMBER,
USED_SPACE NUMBER,
PCT_USED NUMBER,
ROWS_PER_KEY NUMBER,
BLKS_GETS_PER_ACCESS NUMBER,
PRE_ROWS NUMBER,
PRE_ROWS_LEN NUMBER,
OPT_CMPR_COUNT NUMBER,
OPT_CMPR_PCTSAVE NUMBER,
COMMENTS VARCHAR2(300))
/
2 执行下面分析、重建索引的脚本,
set serverout on;
declare
v_sql varchar2(300);
v_Errmsg varchar2(300);
begin
delete from user_index_stats;
commit;
for i in (select table_name, index_name, num_rows from user_indexes where index_type like '%NORMAL%' and partitioned='NO'
and not (regexp_like(table_name,'^TMP[[:alnum:]]{27}$')) and temporary='N' and num_rows > 0 order by 3 desc) loop
begin
v_sql := 'analyze index '||i.index_name||' validate structure ';
execute immediate v_sql;
insert into user_index_stats(table_name, height, blocks, index_name, partition_name,
lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks,
br_rows_len, br_blk_len, del_lf_rows, del_lf_rows_len, distinct_keys,
most_repeated_key, btree_space, used_space, pct_used, rows_per_key, blks_gets_per_access,
pre_rows, pre_rows_len, opt_cmpr_count, opt_cmpr_pctsave)
select i.table_name, height, blocks, name, partition_name,
lf_rows, lf_blks, lf_rows_len, lf_blk_len, br_rows, br_blks,
br_rows_len, br_blk_len, del_lf_rows, del_lf_rows_len, distinct_
ORACLE数据库:如何重建索引。
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。



