ITPub博客

首页 > 数据库 > Oracle > 找出IO最高的SQL语句和process

找出IO最高的SQL语句和process

原创 Oracle 作者:1xian 时间:2009-04-27 16:28:03 0 删除 编辑
找出IO最高的SQL语句和process[@more@]

本来写好的文章,结果session过期了。郁闷。

-------------------------------------------------------------------

1. 前几天在itpub上看到一个通过热块找出相关语句的sql

SELECT /*+rule*/hash_value,sql_text
FROM v$sqltext
WHERE (hash_value,address)IN(
SELECT a.hash_value,a.address
from v$sqltext a,
(SELECT DISTINCT a.owner,a.segment_name,a.segment_type
FROM dba_extents a,
(SELECT dbarfil,dbablk
FROM(SELECT dbarfil,dbablk
FROM X$bh
ORDER BY tch DESC)
WHERE ROWNUM < 11) b
WHERE a.relative_fno=b.dbarfil
AND a.block_id<=b.dbablk
AND a.block_id+a.blocks>b.dbablk) b
WHERE a.sql_text LIKE '%'||b.segment_name||'%'
AND b.segment_type='TABLE')
ORDER BY hash_value,address,piece

2. 测试脚本:

#!/bin/bash
a=2;
while (true)
do

log=`sqlplus -s it01271350/it01271350 << EOF

insert into test(agent) select object_name from dba_objects where rownum <$a;

commit;
EOF`;

echo $log;
let a=${a}+1;
sleep 1;
echo "$a is $a";
done;

该脚本每第N秒往test表插入N条数据。第N秒时,总数据量为:N!条。

test表为分区表: http://1xian.itpub.net/post/39204/483120

3. top iowait:

load averages: 0.43, 0.35, 0.46 16:03:21
195 processes: 190 sleeping, 3 running, 1 stopped, 1 on cpu
CPU states: 69.9% idle, 7.4% user, 4.4% kernel, 18.3% iowait, 0.0% swap
Memory: 8192M real, 3880M free, 2388M swap in use, 4436M swap free

4. 执行该sql:

执行结果的第一条就是:

SELECT DECODE((ROUND(TO_NUMBER(TO_CHAR(SYSDATE, 'MI')) / 30 , 0)), 0,0,1) FROM DUAL

这是: 以半个小时为单位,滚动增加和删除表分区


里每半个小时自动增加分区的procedure里的语句。不明白为什么会出现在这里。为什么是这句呢,为什么不是insert之类的语句呢?

如果不用分区的话,会是什么样的呢?

5. 换一个方法,纯IO的考虑:

Solaris下有人开发了两个类似top 的io相关的小工具,prusage.pl 和 topio。

先试试 prusage.pl:

PID MINF MAJF INBLK OUBLK CHAR-kb COMM
23751 0 0 0 85 344 oracle
23753 0 0 0 53 502 oracle

找到两个pid:23753, 23751

select program from v$process p where p.spid in (23753, 23751);

----

oracle@occb (DBW0)
oracle@occb (LGWR)

分别得到DBW0和LGWR。这的的确确是耗用IO最高的进程。

然后再试试topio:

bash-2.05$ perl topio.pl -d

--PID-------RWChar-----DltRWC-----MjPgFlt-DltMPF Command------------------------
23753 1870218052 1583104 1 0 ora_lgwr_transact
23751 1079399197 753664 0 0 ora_dbw0_transact

差不多的结果。

6.

两种方法都不“究竟”,似乎找到了点什么,但“实无所得”。望路过的达人为我解惑。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/21342557/viewspace-1021348/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: ITpub 的mysql 报错
请登录后发表评论 登录
全部评论

注册时间:2009-04-15

  • 博文量
    13
  • 访问量
    15890