db file sequential read等待事件

上一篇 / 下一篇  2008-06-19 12:57:27 / 个人分类:oracle性能优化

这个等待事件通常是由i/o等待造成的。

首先我们可以通过v$session_wait视图找到该等待。其中,

p1:oracle要读取的数据文件的文件号。

p2:oracle从这个文件中开始读取的block号。

p3:oracle从这个文件开始读取的block号后读取的block数量。

解决方案一:在v$sqlarea中找到物理读多的语句进行优化。

                        select sql_text,disk_reads

                         from  (select sql_text,disk_reads from v$sqlarea order by disk_reads desc)

                        where rownum<21;

                        优化这些语句以减少i/o

                        如果有index range scans但缺走了不该走的索引,就会造成访问更多的block,这时应该强迫使用一个可访问的索引。

                        如果索引的碎片较多(index_stats可以查看),那么每个block存储的索引数据就比较少,这就需要访问的block就多,这是可以重建索引,减少碎片。(详情请见另一片关于索引管理的文章)

                       atler index index name rebuild.

                       如果被使用的索引存在一个很大的cluster factor,那么对于每个索引块要获取相应的记录时就需要访问更多的block。这是可以执行一下语句:

                      create table tablename as select * from orienttablename order by 索引列;

方案二:从v$filestat视图中找到访问比较频繁的数据文件,把它放到能实现负载平衡的raid磁盘上。

利用

select * from v$segment_statistics where statistic_name='physical reads' order by value desc;

方案三:可以增大db_block_buffers或者把常用对象放到keep_buffer_pool.

示例:

找到发生等待的对象:

select sid,p1,p2,p3 from v$session_wait where event='db file sequential read';

 

      SID        P1        P2        P3

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

      234        38    587658         1

 

select s.segment_name, s.partition_name

from dba_extents s

where 587658 between s.block_id and (s.block_id + s.blocks -1) and s.file_id = 38;

 

 

SEGMENT_NAME     PARTITION_NAME

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

NC_STEEL_INFO     P_2007 

 

由此我们发现实在nc_steel_info这张表上发生了等待,发生等待的分区是p_2007.

 

现在我们可以通过上述方法优化。也可以找到访问nc_steel_info表的语句优化。 有几种方法找到

 

bad sql

 

(1) 根据v$session中的sid找

 

 SELECT  /*+ ORDERED */

 2          sql_text

 3     FROM v$sqltext a

 4    WHERE (a.hash_value, a.address) IN (

 5             SELECT DECODE (sql_hash_value,

 6                            0, prev_hash_value,

 7                            sql_hash_value

 8                           ),

 9                    DECODE (sql_hash_value, 0,

prev_sql_addr,

sql_address)

 10               FROM v$session b

 11              WHERE b.sid=234)

 12 ORDER BY a.piece ASC;

 

SQL_TEXT

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

select t.id,t.title,t.classid,t.keyword,t.pubdate,t.pic,t.htmlst

ate,t.execdate,t.bpip,t.pip,t.link,t.havetable,c.freeinfo,c.clas

sname from info_table t,info_class c where t.classid=c.classid a

nd t.id=:1

 

(2) 如上所术直接找到物理i/o多的sql进行优化。

 

(3) 可以从v$sql_plan中找到全表扫描的sql进行优化。

 

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar