查找运行慢的进程及SQL语句

一、造成系统慢的原因初步介绍

     系统运行过程中,用户反映速度慢,作为DBA,应该怎么去查找系统慢的原因?首先需要运行操作系统的当前运行状态,使用一些命令,如VMSTAT、 SAR、SWAPINFO等,观察系统当前的CPU、内存、磁盘、系统缓存等目前运行状态,判断这些系统资源是否存在瓶颈,如果是这些资源的原因而造成系 统存在瓶颈,建议先在硬件资源上进行升级更新。

      如果排除了硬件及操作系统的原因,对于数据库来说,需要判断系统慢的原因,建议在繁忙时期生成STATSPACK报告,并根据报告的结果才能得到比较准确 的判断。对于DBA来说,系统变慢的时候,可以运行一些脚本去检测,常见的问题有锁未及时释放、SQL本身需要优化等原因。下面我们就主要就这两种情况进 行讲解。

二、几种常见的故障检测及解决方法

1、对于锁冲突而引起的系统等待故障:

(1)首先判断当前是否存在进程锁等待的情况:

select * from v$session where lockwait is not null;

(2)如果存在,可以进一步判断是哪个进程占住了锁使得其他的进程在等待。如果这是第一次使用,需要安装ORACLE的内部视图,方法如下:使用SYS用户登上数据库服务器的SQL*PLUS,运行如下SQL命令安装检测锁冲突的系统视图:

@?/rdbms/admin/catblock.sql

(3)使用以下命令可以查看系统当前锁的情况:

@?/rdbms/admin/utllockt.sql

(4)由于某些特殊情况,一些进程一直没有释放锁,使得其他进程无法使用锁住的数据而一直在等待,做为DBA,可以将这些异常的进程找出来并 KILL掉,使系统恢复正常。

找出锁住别的进程的进程sid和serial#:

SELECT sid, serial#

FROM v$session

WHERE sid in (SELECT holding_session FROM dba_waiters);

将这些进程KILL掉:

ALTER SYSTEM

KILL SESSION 'sid,serial#';

以上介绍的是一种常用的方法,用来解决因锁冲突而引起故障,但是由于以上脚本也有些需要申请锁,因此有时也会出现等待的情况,因此建议大家也可以使用OEM工具中的Lock Manager来处理这种情况。

 

2、对于因SQL语句原因造成系统慢:

 

这种情况一般CPU负荷运行时比较满,因此我们可以使用TOP进程观察当前最忙的几个进程分别是什么,如果是ORACLE的前台进程,有可能是此进程造成系统目前比较慢。

记下此进程的PID,使用如下SQL语句查找当前的进程:

select a1.*,a2.* from v$session a1,v$process a2 where a1.paddr=a2.addr and a2.spid=&pid;

对此进程进行分析,看其当前在运行的SQL语句

可以使用以下SQL查看某个进程正在运行的SQL

select sql_text from v$sql where address =(select a1.sql_address from v$session a1,v$process a2 where a1.paddr=a2.addr and a2.spid=&pid);

也可以使用TOAD或OEM工具,对某个SESSION进行查看,可以看到目前SESSION正在运行的SQL语句。

可以使用OEM工具中的TOP SQL,查看系统中对性能影响比较大的SQL语句,具体使用为:选择工具-》Diagnostic Pack-》Top SQL.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值