Oracle9i, 10g 优化分析统计(dbms_stats)脚本

本文介绍Oracle9i与10g数据库中表分析的不同策略。9i版本针对不同规模的表采取固定比例分析,而10g版本则采用自动采样策略,根据表的大小和数据分布自动调整分析比例。

 

---------------------------------------------------------
Oracle9i (未开启table monitoring时) 
---------------------------------------------------------

索引全分析
表分两种,大表10%,小表100%

 


#start
$ORACLE_HOME/bin/sqlplus /nolog <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  => 8
                                      );
    elsif rec.segment_type = 'INDEX PARTITION' then
         dbms_stats.gather_index_stats(ownname => 'USER',
                                       indname => rec.segment_name,
                                       degree  => 8
                                      );
    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 COLUMNS SIZE 1',       -- SIZE 1 不收集直方图信息
                                           degree           => 8);
    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 COLUMNS SIZE 1',
                                           degree           => 8);
    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
<

 

 

 

 


--------------------------------------------------------------
Oracle9i,10g (开启table monitoring时) 
--------------------------------------------------------------


都采用auto方式。

SQL> being
 dbms_stats.gather_schema_stats(
 ownname => 'USER',
 estimate_percent => dbms_stats.auto_sample_size,    -- Oracle根据表的大小和列值分布在5%到20%间取值
 method_opt => 'for all columns size auto',        
 cascade=>TRUE,
 degree => 8 );
     end;
     /

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-616717/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-616717/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值