网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.Oracle数据操作和控制语言详解(二.
.Spring 调用ORACLE存储过程的结果.
.ORACLE的外部调用的实现.
.Linux系统的防病毒方案.
.Developer/2000 R2.1 中文版 在 .
.如何选购Linux可以搭配的机器之V.
.上帝的神谕——ORACLE公司传奇.
.Oracle9i 数据库(第二版)的高级选.
.Oracle数据库的安全策略分析(二.
.ORACLE中的数据库、服务名、实例.
.WEB 计划任务.
.简单的Oracle存储过程的创建方法.
.分区和簇.
.在ORACLE里设置访问多个SQL Serv.
.oracle产品服务和技术级别介绍.
.案例学习Oracle错误:ORA-00604.
.自己动手写操作系统(一).
.如何解决JOB的Interval输入参数过.
.10046event 漫步.
.在Oracle9i Release 2中使用PL/S.

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

发表日期:2008-2-9



  参考了一下别人的代码又补充了一下写了一个存储过程。
  
  分析某一用户下面的表及索引。
  
  运行完毕后然后设置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;
上一篇:分析数据库性能的SQL 人气:642
下一篇:分析诊断进程跟踪文件工具ASS.AWK(2) 人气:924
浏览全部Oracle教程的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐