oracle 9i表分析,Oracle9i, 10g 优化分析统计(dbms_stats)脚本

---------------------------------------------------------

Oracle9i (未开启table monitoring时)

---------------------------------------------------------

索引全分析

表分两种,大表10%,小表100%

#start

$ORACLE_HOME/bin/sqlplus /nolog

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;

/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值