[English]
作者:
fuyuncat
来源:
www.HelloDBA.com
3.2 数据文件相关的IO事件
数据库系统中的大多数的IO请求都是针对数据文件的。因此大多数情况下,与数据文件相关的IO事件是引起系统IO性能的主要原因。这些事件也是我们文章需要重点介绍的事件。下面分别针对不同事件介绍问题的解决思路。
3.2.1 db file sequential read
这个事件是是最常见的IO等待事件。它一般发生在读取单独数据块时,如读取索引数据块或者通过索引访问一个表数据块,另外在读取数据文件头数据块时也会发生db file sequential read等待事件。
当发现这个等待事件成为系统等待事件中的主要事件,我们可以通过一下方法来处理:
3.2.1.1 优化Top SQL
从statspack或者awr报告中的“SQL ordered by Reads”部分或者通过V$SQL视图找出系统中的Top SQL,对SQL进行调优以减少IO请求。
- 当SQL中存在Index Range Scan时,如果访问的索引的选择性不好就会导致需要访问过多的数据块,这时可以通过建立一个、或强制SQL使用一个已经存在的选择性更好的索引。这样使我们访问更少的数据块来获取到需要的数据。
SQL> select object_id, object_name2 from t_test13 where owner = 'SYS'4 and created > sysdate - 30;no rows selectedExecution Plan----------------------------------------------------------Plan hash value: 4014220762--------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |--------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 1 | 39 | 11 (0)| 00:00:01 ||* 1 | TABLE ACCESS BY INDEX ROWID| T_TEST1 | 1 | 39 | 11 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | T_TEST1_IDX1 | 576 | | 1 (0)| 00:00:01 |--------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - filter("OWNER"='SYS' AND "CREATED">SYSDATE@!-30)Statistics----------------------------------------------------------0 recursive calls0 db block gets658 consistent gets45 physical reads0 redo size339 bytes sent via SQL*Net to client374 bytes received via SQL*Net from client1 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)0 rows processedSQL> create index t_test1_idx2 on t_test1(owner, created);Index created.SQL> select object_id, object_name2 from t_test13 where owner = 'SYS'4 and created > sysdate - 30;no rows selectedExecution Plan----------------------------------------------------------Plan hash value: 3417015015---------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 49 | 1911 | 2 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID| T_TEST1 | 49 | 1911 | 2 (0)| 00:00:01 ||* 2 | INDEX RANGE SCAN | T_TEST1_IDX2 | 49 | | 1 (0)| 00:00:01 |---------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------2 - access("OWNER"='SYS' AND "CREATED">SYSDATE@!-30)Statistics----------------------------------------------------------1 recursive calls0 db block gets2 consistent gets1 physical reads0 redo size339 bytes sent via SQL*Net to client