|
如
[php]
#start
$ORACLE_HOME/bin/sqlplus /nolog <<EOF
connect user/xxxx
prompt "analyze start,please wait......"
set serveroutput on size 100000
declare
v_per number(3);
v_start number := dbms_utility.get_time;
v_time number;
begin
for rec in (select segment_name,segment_type,ceil(sum(bytes)/1024/1024) segment_size
from user_segments
where segment_type like 'TABLE%' or segment_type like 'INDEX%'
group by segment_name,segment_type)
loop
--start analyze
if rec.segment_type = 'INDEX' then
dbms_stats.gather_index_stats(ownname => 'USER',
indname => rec.segment_name,
degree => 2
);
elsif rec.segment_type = 'INDEX PARTITION' then
dbms_stats.gather_index_stats(ownname => 'USER',
indname => rec.segment_name,
degree => 2
);
elsif rec.segment_type = 'TABLE' then
case when rec.segment_size < 100 then
v_per := 100;
else
v_per := 10;
end case;
dbms_stats.gather_table_stats(ownname => 'USER',
tabname => rec.segment_name,
estimate_percent => v_per,
method_opt => 'FOR ALL INDEXED COLUMNS',
degree => 2);
elsif rec.segment_type = 'TABLE PARTITION' then
v_per := 10;
dbms_stats.gather_table_stats(ownname => 'USER',
tabname => rec.segment_name,
estimate_percent => v_per,
method_opt => 'FOR ALL INDEXED COLUMNS',
degree => 2);
end if;
v_time := ceil((dbms_utility.get_time - v_start)/100);
dbms_output.put_line(rpad(rec.segment_name||'('||rec.segment_size||'M)',40,'.')||'elaped time '||v_time||'s');
v_start := dbms_utility.get_time;
end loop;
end;
/
prompt "analyze end"
exit
EOF
date
[/php] |
|