oralce sql分析

Oracle查询后台正在运行着的SQL语句


select a.program, b.spid, c.sql_text from v$session a, v$process b, v$sqlarea c where a.paddr=b.addr and a.sql_hash_value=c.hash_value and a.username is not null and a.status='ACTIVE';


select * from v$session_Longops where sofar<> totalwork;


查询前10条性能差的SQL


select * from ( select PARSING_USER_ID, EXECUTIONS, SORTS, COMMAND_TYPE, DISK_READS,SQL_TEXT from v$SQLAREA ORDER BY disk_reads DESC) where ROWNUM <10;


消耗资源大的Oracle的Session及其执行的语句


select a.username, a.machine, a.program, a.sid, a.serial#, a.status, c.piece, c.sql_text from v$session a, v$process b, v$sqltext c where b.spid = '????' and b.addr = a.paddr and a.sql_address=c.address(+) order by c.piece;


???? select * from v$process; 来查询。
spid为topas查看到的OS段的process id


通过这个SQL看一下执行计划是否走索引,对其优化避免全表扫描,以减少I/O等待,从而加快语句的执行速度。
碰到使用in的语句,要用exists把它给换掉,因为Oracle在处理in是是按照or的方式做的。即使使用了索引也会很慢。 


查看占I/O比较大的正在运行的session, 可以借助v$session_wait这个视图,分析session在等待什么,使用了多少的I/O。


select se.sid, se.serial#, pr.SPID, se.username, se.status, se.terminal, se.program, se.MODULE, se.sql_address, st.event, st.p1text, si.physical_reads, si.block_changes from v$session se, v$session_wait st, v$sess_io si, v$process pr where st.sid=se.sid and st.sid=si.sid and se.PADDR=pr.ADDR and se.sid>6 and st.wait_time=0 and st.event NOT like '%SQL%' order by physical_reads desc;


结果说明:
(1)按每个正在等待的session已经发生的物理读排的顺序,因为它与实际的I/O相关。
(2)可以看一下这些进程都在忙什么,语句是否合理?
select sql_address from v$session whre sid = <sid>;
select * from v$sqltext where address=<sql_address>;
执行以上两个语句可以得到这个session的语句。
你也可以用alter system kill session 'sid, serial#'; 把这个session杀掉。


关注event列, 这是我们优化的关键,下面对常出现的event做出简要的说明。
1. buffer相关参数
(1)buffer busy waits
(2)free buffer waits
这两个参数所标识的是DBWR是否够用的问题,与I/O关系很大,当v$session_wait中的free buffer wait的条目很小或没有的时候,说明你的系统的DBWR进程绝对够用,不用调整; free butter wait的条目很多,你的系统感觉起来一定很慢,这时说明DBWR已经不够用了,它产生的WIO已经成为数据库的性能瓶颈,解决办法如下:
(1)增加写进程,同时调整db_block_lru_latches参数
示例:
db_writer_processes=4
db_block_lru_latches=8


DBWR - 数据库写进程(Data Base Writer),将数据缓冲区中所有修改过的缓冲块数据文件中,并使用LRU算法来保持缓冲区中的数据库为最近经常使用的,以减少I/O次数。




2. db file sequential read, 指的是顺序读,即全表扫描,这也是我们应该尽量减小的部分,解决的办法就是使用索引,SQL调优,同时可以增大db_file_multiblock_read_count。


3. db file scattered read, 指的是通过索引来读取,同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。


4. latch free, 需要专门调节。


5. 其他参数可以不特别关注。


查看当前不为空的连接
selent * from v$session where username is not null;
查看不同用户的连接数
select username,count(username) from v$session where username is not null group by username;
查看所有的连接数
select count(*) from v$session;
查看并发连接数
select count(*) from v$session where status='ACTIVE'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值