Posted on 2006-02-07 17:04
柳随风 阅读(1109)
评论(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;
这是我目前工作中常用的两种方法,如果有其他方法,希望大家也共享出来。