动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   数据库 → 阅读文章
  

 定期分析数据库对象的脚本

作者来源: 
阅读 数 175 人次 , 2006-3-18 11:53:00 

ORACLE9以后如果你想用基于成本的优化器,需要定期(每周)对数据库里的表和索引做analyze分析。

 

数据库参数文件initorasid.ora里默认的优化器optimizer_mode = choose



你要改成optimizer_mode = first_rows(OLTP系统)

optimizer_mode = all_rows(DSS 系统)



下面是一个可以在UNIX环境自动生成分析表和索引的脚本analyze.sh



(sys用户的密码password要根据情况修改。)



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

su - oracle -c "sqlplus sys/password"<<!

set pages 9999

set heading off

set echo off

set feedback off

spool /oracle_backup/bin/analyze.sql;

select

'analyze table '||owner||'.'||table_name||' estimate statistics sample 5000 rows;'

from dba_tables

where owner not in ('SYS','SYSTEM','PERFSTAT');

select

'analyze index '||owner||'.'||index_name||' compute statistics;'

from dba_indexes

where owner not in ('SYS','SYSTEM','PERFSTAT');

spool off;

set echo on

set feedback on

spool /oracle_backup/log/analyze.log;

@/oracle_backup/bin/analyze.sql

spool off;

exit;

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

如果你经常变动的表和索引只属于某个特定的用户(如果是test)可以把上面的



owner not in ('SYS','SYSTEM','PERFSTAT') 改成

owner in ('TEST')



来进行定期的分析。



注意事项:如果你使用的是默认的优化器(choose),一定不要定期使用上面那个analyze.sh脚本。

      因为这时优化器可能更倾向于全表扫描。



如果统计分析资料不全,SQL运行时会对缺少统计资料的表进行数据采集。会大大降低SQL的执行速度。



我们要用下面这个del_analyze.sh脚本定期删除可能产生的分析结果, 保证优化器按规则(rule)执行。



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

su - oracle -c "sqlplus sys/password"<<!

set pagesize 9999;

set linesize 120;

set heading off;

set echo off;

set feedback off;

spool /oracle_backup/bin/del_analyze.sql;

select

'analyze table '||owner||'.'||table_name||' delete statistics;'

from dba_tables

where owner not in ('SYS','SYSTEM','PERFSTAT');

select

'analyze index '||owner||'.'||index_name||' delete statistics;'

from dba_indexes

where owner not in ('SYS','SYSTEM','PERFSTAT');

spool off;

set echo on;

set feedback on;

spool /oracle_backup/log/del_analyze.log;

@/oracle_backup/bin/del_analyze.sql

spool off;

exit;

 本文Tags数据库  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:在ORACLE里设置访问多个SQL Server数据库
· 下一篇:OLTP和DSS不同数据库设计
· SQLServer和Oracle的常用函数对比
· ORACLE常见错误代码的分析与解决(一)
· MySQL数据库安全配置指南(1)
· 通过oms实现Oracle的数据备份
· MySQL查询优化程序


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077