分享
 
 
 

定时执行存储过程对库表及索引进行分析

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

参考了一下别人的代码又补充了一下写了一个存储过程。

分析某一用户下面的表及索引。

运行完毕后然后设置job即可。

create or replace procedure DBA_ANAYZE_SCHEMA(v_USERNAME VARCHAR2)

AS

v_per number(3) DEFAULT 100;

v_start number := dbms_utility.get_time;

--v_end number;

begin

/*********************

该存储过程主要是对表及索引进行分析,

对于包含有子分区sub-partition的表需要注重一下granularity参数。具体参考:

-- granularity - the granularity of statistics to collect (only pertinent

--if the table is partitioned)

-- 'DEFAULT' - gather global- and partition-level statistics

-- 'SUBPARTITION' - gather subpartition-level statistics

-- 'PARTITION' - gather partition-level statistics

-- 'GLOBAL' - gather global statistics

-- 'ALL' - gather all (subpartition, partition, and global) statistics

*******************************/

for rec in (select segment_name,segment_type,ceil(sum(bytes)/1024/1024) segment_size

from user_segments where SEGMENT_NAME NOT LIKE 'TMP_%'

group by segment_name,segment_type)

loop

CASE WHEN rec.segment_type = 'INDEX' THEN

case

when rec.segment_size <=100 then

v_per := 100;

when rec.segment_size <=300 then

v_per := 50;

else

v_per := 20;

end case;

begin

--delete old schema index statistics;

DBMS_STATS.delete_index_stats(ownname = upper(v_USERNAME),

indname = rec.segment_name);

exception

when others then

null;

end;

begin

--analyze index compute statistics;

dbms_stats.gather_index_stats(ownname=upper(v_USERNAME),--自己改一下

INDNAME=rec.segment_name,

estimate_percent =v_per,

degree = 2 );

exception

when others then

null;

end;

--dbms_output.put_line(rec.segment_name' 'rec.segment_size'm 'ceil((dbms_utility.get_time - v_start)/100)'s');

v_start := dbms_utility.get_time;

WHEN rec.segment_type = 'TABLE' then

--

case when rec.segment_size <=150 then

v_per := 100;

when rec.segment_size <=500 then

v_per := 50;

else

v_per := 20;

end case;

begin

--delete table analyze statistics

dbms_stats.delete_table_stats(ownname =upper(v_USERNAME),

tabname =rec.segment_name);

exception

when others then

null;

end;

begin

--analyze table compute statistics;

dbms_stats.gather_table_stats(OWNNAME=upper(v_USERNAME),

TABNAME=rec.segment_name,

ESTIMATE_PERCENT=v_per,

cascade = TRUE,

granularity = 'ALL',

degree = 2,

METHOD_OPT='FOR ALL INDEXED COLUMNS');

exception

when others then

null;

end;

-- dbms_output.put_line(rec.segment_name' 'rec.segment_size'm 'ceil((dbms_utility.get_time - v_start)/100)'s');

v_start := dbms_utility.get_time;

WHEN rec.segment_type = 'TABLE PARTITION' then

case when rec.segment_size <=150 then

v_per := 100;

when rec.segment_size <=500 then

v_per := 50;

else

v_per := 20;

end case;

begin

--delete table analyze statistics

dbms_stats.delete_table_stats(ownname =upper(v_USERNAME),

tabname =rec.segment_name);

exception

when others then

null;

end;

begin

--analyze table compute statistics;

dbms_stats.gather_table_stats(OWNNAME=upper(v_USERNAME),

TABNAME=rec.segment_name,

ESTIMATE_PERCENT=v_per,

cascade = TRUE,

granularity = 'ALL',

degree = DBMS_STATS.DEFAULT_DEGREE,

METHOD_OPT='FOR ALL INDEXED COLUMNS');

exception

when others then

null;

end;

WHEN rec.segment_type = 'INDEX PARTITION' then

case

when rec.segment_size <=100 then

v_per := 100;

when rec.segment_size <=300 then

v_per := 50;

else

v_per := 20;

end case;

begin

--delete old schema index statistics;

DBMS_STATS.delete_index_stats(ownname = upper(v_USERNAME),

indname = rec.segment_name);

exception

when others then

null;

end;

begin

--analyze index compute statistics;

dbms_stats.gather_index_stats(ownname=upper(v_USERNAME),--自己改一下

INDNAME=rec.segment_name,

estimate_percent =v_per,

degree =dbms_stats.DEFAULT_DEGREE

);

exception

when others then

null;

end;

--dbms_output.put_line(rec.segment_name' 'rec.segment_size'm 'ceil((dbms_utility.get_time - v_start)/100)'s');

v_start := dbms_utility.get_time;

/** WHEN rec.segment_type = 'LOBINDEX' then

v_start := dbms_utility.get_time;

WHEN rec.segment_type = 'LOBSEGMENT' then

v_start := dbms_utility.get_time;**/

END CASE;

end loop;

end;

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有