博主总结了排查性能问题时用的命令。
查看操作系统资源的消耗情况,可帮助定位找出性能瓶颈
方式1:nmon ---> 按d
方式2:iostat -d 5
方式1: pidstat
方式2:top
命令:top ---> 按C(注意是大写)
作用: 按CPU 消耗情况排序
命令:top -Hp <进程号>-n 1 -b
作用:打印对应进程所有线程的CPU消耗情况,可以配合方式3的pstack,可以找出对应线程堆栈。
命令:ps -eLo pcpu,pid,lwp,%cpu |grep <进程号>;echo 'pcpu,pid,lwp,%cpu'
作用:打印进程启动至今的CPU汇总
方式3: pstack <进程号>
方式4: nmon ---> 按c
方式1:top --->按M(注意是大写)
方式2: free -h
方式1: nmon 按 n
dstat 可打印cpu、IO、网络情况
以下执行的SQL,尽量用sysdba 查看,否则只会打印对应用户的执行状态
1.打印全部SQL
select
sysdate ,
SF_GET_SESSION_SQL(SESS_ID), --获取完整 SQL
sess_id ,
sess_seq ,
sql_text ,
state ,
seq_no ,
user_name ,
trx_id ,
create_time ,
clnt_ip
from
v$sessions
where
state='ACTIVE';
2.打印执行超过2s 的SQL
select * from
(
SELECT
user_name ,
clnt_ip ,
sess_id ,
sql_text ,
datediff(ss, last_send_time, sysdate) ss,
SF_GET_SESSION_SQL(SESS_ID) fullsql
FROM
V$SESSIONS
WHERE
STATE='ACTIVE' and user_name!='SYSDBA'
)
where ss>=2 order by 5 desc;
1.打印锁占用情况
SELECT
DS.SESS_ID "被阻塞的会话ID",
DS.SQL_TEXT "被阻塞的SQL",
DS.TRX_ID "被阻塞的事务ID",
(CASE L.LTYPE WHEN 'OBJECT' THEN '对象锁' WHEN 'TID' THEN '事务锁' END CASE ) "被阻塞的锁类型",
DS.CREATE_TIME "开始阻塞时间",
SS.SESS_ID "占用锁的会话ID",
SS.SQL_TEXT "占用锁的SQL",
SS.CLNT_IP "占用锁的IP",
L.TID "占用锁的事务ID"
FROM
V$LOCK L
LEFT JOIN V$SESSIONS DS
ON
DS.TRX_ID = L.TRX_ID
LEFT JOIN V$SESSIONS SS
ON
SS.TRX_ID = L.TID
WHERE
L.BLOCKED = 1
2.释放锁
SP_CLOSE_SESSION ( 占用锁的会话 ID );
3.查询死锁记录
select
dh.trx_id ,
sh.sess_id,
wm_concat(top_sql_text)
from
V$DEADLOCK_HISTORY dh,
V$SQL_HISTORY sh
where
dh.trx_id =sh.trx_id
and dh.sess_id=sh.sess_id
group by
dh.trx_id, sh.sess_id;
1.查询有事务未提交的表
SELECT b.object_name, c.sess_id, a.*
FROM v$lock a, dba_objects b, v$sessions c
WHERE a.table_id = b.object_id AND ltype = 'OBJECT' AND a.trx_id = c.trx_id;
2.查询实例中已执行未提交的 SQL
SELECT t1.sql_text, t1.state, t1.trx_id
FROM v$sessions t1, v$trx t2
WHERE t1.trx_id = t2.id AND t1.state = 'IDLE' AND t2.status = 'ACTIVE';
1.查询执行在 1 秒以上的SQL语句使用的内存
SELECT "SESSID", MAX_MEM_USED||'KB',SQL_TXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;
2. 查询占用 io 较大的 sql
select
s.sess_id ,
s.sql_text ,
s.user_name ,
s.state ,
st.PHY_READ_CNT,
st.iO_WAIT_TIME
from
v$sessions s, v$session_stat st
where
s.sess_id=st.sessid and s.state ='ACTIVE'
ORDER BY 5 DESC;
3.查找性能相对较差的 sql
select
SQL_TXT ,EXEC_TIME , PARSE_CNT ,
PARSE_TIME ,HARD_PARSE_CNT,HARD_PARSE_TIME
FROM
v$sql_stat
ORDER BY
HARD_PARSE_CNT DESC,
EXEC_TIME DESC;
1.查看缓存命中率
select
name 缓冲池名称,
sum(page_size)*sf_get_page_size 缓冲池大小_G,
sum(rat_hit) /count(*) 命中率
from
v$bufferpool
group by name;
tips:数据缓冲区设定得太小,会导致缓冲页命中率低,磁盘 IO 频繁
2.查看缓冲池情况
SELECT * FROM V$SCP_CACHE;
文章
阅读量
获赞