beauty_beast

上善若水 厚德载物

oracle调优三步骤之一:查找性能隐患

Posted on 2006-02-07 17:04 柳随风 阅读(1108) 评论(0)  编辑  收藏 所属分类: oracle调优

        oracle调优工作是非常复杂的,涉及到的方方面面也比较多,但从实际做的项目来看,往往都是应用程序编写的sql存在性能问题,个人认为如果没有用到oracle比较复杂的特性功能,一般的调优还是有章可循的。基本就是三步: 查找、分析、优化,我总结了在项目中一些经验,和大家一起分享,有不对的地方请大家多多指正。
       一个新系统刚上线的时候,用户量、数据量都不是很多,性能问题一般不会很快体现出来,当用户反映系统开始慢、http请求长时间没有响应(严重的时候导致整个应用down机)时,我们就要密切关注了。
查找的方法实际上oracle已经提供了相关工具-statspack。
该工具的安装、使用比较简单,日常主要用到的是脚本:
        脚本路径${oracle_home}/rdbms/admin目录下:
        --spdrop.sql   删除脚本,丢弃统计分析的相关包、视图、表、同义词等对象(首次创建无须执行)
        --spcreate.sql 创建脚本,生成统计分析的相关包、视图、表、同义词等对象(首次执行前先创建一个表空间)
        --统计时生成两次快照,一般在30-40分钟左右
        --执行方法
             用sys登陆sqlplus后间隔对应时间执行两次 exec statspack.snap;

        --spreport.sql 生成报告记录sql ,生成的报告文件在系统当前路径下,文件名默认为:
               sp_开始快照号_结束快照号.lst 
        --sprepsql.sql  分析相关快照中的sql执行计划,
        --sppurge.sql  删除在两个快照号之间包括本身的所有统计分析数据。
        --sptrunc.sql  截取statspack统计分析的相关数据  在统计分析的对应用户perfstat下执行
 每次执行快照生成的统计数据都在perfstat用户中相关的表中,
 常用的:
         --查询快照相关信息
            select snap_id,snap_time from stats$snapshot;
        --根据hash_value,快照查询对应的统计sql(statspack报告中sql过长会被截掉)
            select sql_text  from stats$sqltext where hash_value=查询值 and last_snap_id=begin_snap_id;
         如果使用statspack工具,建议将timed_statistics 设置为true,否则无法查看到准确的统计信息(9i版本后的设置为true对系统性能影响较小)。
             alter system set timed_statistics=true;

如果需要实时的查找性能隐患的相关sql,通过v$session_wait,v$session,v$sqltext_with_newlines三张动态视图就可以基本查找到相关的sql,脚本如下:
        

select sql_text ,sw.event
from v$sqltext_with_newlines st,v$session se,v$session_wait sw
where st.address=se.sql_address and st.hash_value=se.sql_hash_value
and se.sid =sw.sid and  
(sw.event 
= 'buffer busy waits' or
  sw.event 
= 'enqueue' or
  sw.event 
= 'free buffer waits' or
  sw.event 
= 'global cache freelist wait' or
  sw.event 
= 'latch free' or
  sw.event 
= 'log buffer space' or
  sw.event 
= 'parallel query qref latch' or
  sw.event 
= 'pipe put' or
  sw.event 
= 'write complete waits' or
  sw.event 
like 'library cache%' or
  sw.event 
like 'log file switch%' 
)  
order by st.hash_value,st.piece; 

 
这是我目前工作中常用的两种方法,如果有其他方法,希望大家也共享出来。





 

只有注册用户登录后才能发表评论。


网站导航: