oracle执行计划oop,从操作系统命令TOP到数据库的优化

对于一个刚开始学习数据库优化的新手DBA来说,当用户反馈系统比较慢时,他会非常紧张,面对数据库,他无从下手,不知道从哪里开始着手来优化数据库,查找系统

存在的问题。

今天我们通过操作系统命令TOP,来优化数据,我们如何把操作系统与数据库关联起来哪,我们主要是通过操作系统TOP命令找到最消耗资源OS PID进程。

通过OS PID与V$PROCESS动态性能试图进行管理。我们知道V$PROCESS是被认为从操作系统到数据库的入口,而进入数据库内部,进程需要创建回话(SESSION)执行数据库操作的SQL语句,一般情况下,一个进程只会创建一个回话,但是在特殊的情况下,一个进程也可以创建多个数据库回话。回话的信息是通过动态性能试图V$SESSION来进行管理和体现的。

那么我们通过一个实验来看一下,如何完成从操作系统命令到数据库内部的操作,我们模拟一个出现故障的场景,我们通过操作系统命令TOP,进行观察,找到操作系统进程占CPU资源比较高的进程。

1.首先我们建立一个测试表t1,向表中插入一些数据。

SQL>create table t1 as select * from emp;

SQL>insert into t1 as select * from t1;

SQL>/

SQL>/

SQL>/

SQL>/

使表T1大约有几万条记录。

2.开3,4个会话,其中表t1有几万行的数据,同时运行,立刻查询上面的语句

declare

v1 emp.sal%type;

begin

for n in 1..100 loop

for k in 1..100 loop

select count(*) into v1 from t1;

end loop;

dbms_lock.sleep(1);

end loop;

end;

/

3.通过操作系统命令TOP找到消耗CPU资源的进程

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的执行计划,达到优化的目的。

2014.08.18 13:28

share you knowledge with the world.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值