首页 > 数据库 > Oracle > 从操作系统命令TOP到数据库的优化
top - 12:57:42 up 19 min, 2 users, load average: 1.18, 0.35, 0.23
Tasks: 132 total, 2 running, 130 sleeping, 0 stopped, 0 zombie
Cpu(s): 20.5%us, 5.9%sy, 0.0%ni, 73.1%id, 0.5%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1034664k total, 883716k used, 150948k free, 125584k buffers
Swap: 4120664k total, 0k used, 4120664k free, 609440k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5182 oracle 19 0 368m 50m 48m S 37.9 5.0 0:03.57 oracle
1 root 15 0 2160 652 564 S 0.0 0.1 0:02.30 init
2 root RT -5 0 0 0 S 0.0 0.0 0:00.05 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.04 migration/1
5 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
6 root 10 -5 0 0 0 S 0.0 0.0 0:00.04 events/0
7 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 events/1
8 root 11 -5 0 0 0 S 0.0 0.0 0:00.01 khelper
9 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kthread
13 root 10 -5 0 0 0 S 0.0 0.0 0:00.10 kblockd/0
14 root 10 -5 0 0 0 S 0.0 0.0 0:00.02 kblockd/1
15 root 16 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid
179 root 12 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue/0
180 root 12 -5 0 0 0 S 0.0 0.0 0:00.00 cqueue/1
183 root 11 -5 0 0 0 S 0.0 0.0 0:00.00 khubd
185 root 10 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod
252 root 18 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
253 root 17 0 0 0 0 S 0.0 0.0 0:00.00 pdflush
254 root 15 0 0 0 0 S 0.0 0.0 0:00.03 pdflush
4.我们看到进程PID等于5182,我们下面的一个脚本,关联V$PROCESS试图和V$SESSION试图、V$SQLTEST试图,可以找出这个进程正在执行的SQL语句,这里只需要一个“发动”条件,就是进程(PID):
SQL>SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN
(SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr =
(SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC;
/
提示输入变量值。
Enter value for pid: 5182
old 9: (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
new 9: (SELECT addr FROM v$process c WHERE c.spid = '5182'))
SQL_TEXT
----------------------------------------------------------------
declare v1 number; begin for n in 1..100 loop for k in 1..100 l
oop select count(*) into v1 from t1; end loop; dbms_lock.sleep(1
); end loop; end;
注:这里我们使用了3个动态性能试图,获取到了执行的SQL语句。我们的逻辑是:
1)首先输入一个PID,这个PID即是process id,也就是在TOP命令中看到的PID.
2)通过PID和v$process.spid相关,我们可以获得process的详细信息。
3)通过v$process.addr和v$session.paddr相关联,可以获取session的相关详细信息。
4)再结合v$sqltest,即可获得当前session正在执行的SQL语句。
总结:
1.首先我们通过操作系统命令TOP找到了PID.
2.我们结合3个试图,就找打了当前正在疯狂消耗CPU的罪魁祸首,那么下面的工作就是如何优化这个SQL,我们可以进一步通过
dbms_system包跟踪改进程,或者通过AWR获取该SQL的执行计划。来改变SQL的执行计划,达到优化的目的。
pxboracle@live.com
2014.08.18 13:28
share you knowledge with the world.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13189147/viewspace-1257240/ ,如需转载,请注明出处,否则将追究法律责任。