選出需要rebuild的索引

2021-08-24 22:27:01 字數 3532 閱讀 7704

自己編寫的乙個指令碼,該指令碼的主要功能是列出需要rebuild的索引,列出狀態為unusable的索引。我沒有將oracle內建賬戶的索引考慮在內。

需要rebuild的索引遵循如下原則:

1.索引高度大於等於4

2.索引中被刪除的資料超過索引資料的20%。

3.索引的狀態為valid

警告:別胡亂在生產庫中執行該指令碼,千萬別在繁忙的時候執行該指令碼,慎重,慎重

set serveroutput on

set linesize 200

set pagesize 100

declare

cursor spetial is

select index_name,owner from dba_indexes where owner not in

('sys','sysman','system','mdsys','olapsys','dmsys','ordsys','exfsys','xdb','ctxsys','wmsys','outln','ismsys','dbsnmp','tsmsys') and status='unusable';

cursor index_name is

select index_name,owner from dba_indexes where owner not in

('sys','sysman','system','mdsys','olapsys','dmsys','ordsys','exfsys','xdb','ctxsys','wmsys','outln','ismsys','dbsnmp','tsmsys') and status='valid';

height index_stats.height%type :=0;

lf_rows index_stats.lf_rows%type :=0;

del_lf_rows index_stats.del_lf_rows%type :=0;

distinct_keys index_stats.distinct_keys%type :=0;

begin

for c_spetial in spetial loop

dbms_output.put_line(c_spetial.owner ||'.' || c_spetial.index_name ||' is unusable.');

end loop;

for indexname in index_name loop

execute immediate 'analyze index '|| indexname.owner ||'.'|| indexname.index_name ||' validate structure';

select height,decode(lf_rows,0,1,lf_rows),del_lf_rows,decode(distinct_keys,0,1,distinct_keys)

into height,lf_rows,del_lf_rows,distinct_keys from index_stats;

if(height>=4) or ((del_lf_rows/lf_rows)>0.2) then

dbms_output.put_line(' the height of '|| indexname.owner || '.'|| indexname.index_name || ' is '||

height || ' and the del_lf_rows/lf_rows is ' || del_lf_rows/lf_rows || ' needs rebuild!!!');

end if;

end loop;

exception

when others then

null;

end;

/例子:

sql> declare

2 cursor spetial is

3 select index_name,owner from dba_indexes where owner not in

4 ('sys','sysman','system','mdsys','olapsys','dmsys','ordsys','exfsys','xdb','ctxsys','wmsys','outln','ismsys','dbsnmp','tsmsys') and status='unusa

5 cursor index_name is

6 select index_name,owner from dba_indexes where owner not in

7 ('sys','sysman','system','mdsys','olapsys','dmsys','ordsys','exfsys','xdb','ctxsys','wmsys','outln','ismsys','dbsnmp','tsmsys') and status='valid

8 height index_stats.height%type :=0;

9 lf_rows index_stats.lf_rows%type :=0;

10 del_lf_rows index_stats.del_lf_rows%type :=0;

11 distinct_keys index_stats.distinct_keys%type :=0;

12 begin

13 for c_spetial in spetial loop

14 dbms_output.put_line(c_spetial.owner ||'.' || c_spetial.index_name ||' is unusable.');

15 end loop;

16 for indexname in index_name loop

17 execute immediate 'analyze index '|| indexname.owner ||'.'|| indexname.index_name ||' validate structure';

18 select height,decode(lf_rows,0,1,lf_rows),del_lf_rows,decode(distinct_keys,0,1,distinct_keys)

19 into height,lf_rows,del_lf_rows,distinct_keys from index_stats;

20 if(height>=4) or ((del_lf_rows/lf_rows)>0.2) then

21 dbms_output.put_line(' the height of '|| indexname.owner || '.'|| indexname.index_name || ' is '||

22 height || ' and the del_lf_rows/lf_rows is ' || del_lf_rows/lf_rows || ' needs rebuild!!!');

23 end if;

24 end loop;

25 end;

26 /

scott.lowername is unusable.

pl/sql 過程已成功完成。

生成指定表rebuild所有索引的語句

需要對錶大資料量操作的時候,如delete,需要對索引可以選擇性的操作!可以使用下面語句生成 declare tname varchar 100 declare size int set size 0 這裡設定索引大小限制,如果不設定預設為0即所有索引 set tname tblorders sel...

索引筆記《二》確定需要建立索引的列

目錄 確定需要建立索引的列 主鍵列和唯一鍵列的索引 外來鍵列的索引 其他適合建立索引的列 索引指南 小結現在我們把注意力轉到應為哪些列建立索引上。對於初學者來說,我們建議對於大多數應用程式,在下列情況下建立索引。為每個表定義主鍵約束 這導致在主鍵指定的列上自動建立索引。在要求唯一且不同於主鍵列的列上...

HDU 5531 Rebuild 相切的圓們

終於迎來了長春的重現。賽場上太多的遺憾,比賽的時候唯一看都沒看一眼的題就是這個題,太可惜了。連同b題一起,為了搶個fb對不住打重現賽的童鞋們了。求放過,也不知道這個時候寫題解算不算違規呢哈哈。題意 按順序給出乙個多邊形,以多邊形的每個頂點為圓心作圓,使得任意兩相鄰點對應的圓相切,求所有圓面積總和的最...