- 查看oracle 版本信息
[oracle@xag182 ~]$ sql admin/xag123@127.0.0.1:1521/pdb1
SQL> set sqlformat ansiconsole
SQL> select * from v$version;
BANNER CON_ID
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for Linux: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0
- Db file scattered read
这个等待事件在实际生产库中经常可以看到,这是一个用户操作引起的等待事件,当用户发出每次I/O需要读取多个数据块这样的SQL 操作时,
会产生这个等待事件,最常见的两种情况是全表扫描(FTS: Full Table Scan)和索引快速扫描(IFFS: index fast full scan)。
这个名称中的scattered( 分散),可能会导致很多人认为它是以scattered 的方式来读取数据块的,其实恰恰相反,当发生这种等待事件时,
SQL的操作都是顺序地读取数据块的,比如FTS或者IFFS方式(如果忽略需要读取的数据块已经存在内存中的情况)。
这里的scattered指的是读取的数据块在内存中的存放方式,他们被读取到内存中后,是以分散的方式存在在内存中,而不是连续的。
这个等待事件有三个参数:
File#: 要读取的数据块所在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks: 需要读取的数据块数目。
- 測試Db file scattered read場景
create table t4
as
select rownum row_no,
rpad('M',9,'A') ca
from dual connect by level<=100000;
SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT TOTAL_WAITS AVERAGE_WAIT
db file sequential read 18638 1.34
db file scattered read 1193 2.1 ------------------------
db file single write 12 0.17
db file parallel read 8 8.54
SQL> select * from t4;
ROW_NO CA
1 MAAAAAAAA
...
100000 MAAAAAAAA
SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT TOTAL_WAITS AVERAGE_WAIT
db file sequential read 18638 1.34
db file scattered read 1211 2.06 -----------------------------
db file single write 12 0.17
db file parallel read 8 8.54
-
oracle在执行FTS时也进行Single Block I/O。这时即便是FTS也会发生db file sequential read等待。
FTS上使用Single Block I/O或读取比MBRC值小的块数的情况如下:
(1)达到区的界线时:如一个区有9个块,一次Multi Block I/O读取8个块,则一次以Multi Block I/O读取之后的剩余一个块通过
Single Block I/O读取,如果剩下的块有两个,就会执行Multi Block I/O,而且只读取两个块。
(2)扫描过程中读取被缓存的块时:如读取8个块时,其中第三个块被缓存,oracle将前两个块通过Multi Block I/O读取,
对于第三个块执行一次Logical I/O,剩下的5个块通过Multi Block I/O读取。这种情况经常发生时,因引发多次的I/O,
可能成为FTS速度下降的原因。
(3)存在行链接时:在执行FTS的过程中,如果发现了行链接,oracle为了读取剩下的行引起的附加I/O,此时执行Single Block I/O。
SQL> show parameter mult
NAME TYPE VALUE
----------------------------- ------- -----
db_file_multiblock_read_count integer 128
parallel_adaptive_multi_user boolean FALSE
SQL> select OWNER,SEGMENT_NAME ,SEGMENT_TYPE,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents
where segment_name='T4' AND owner='ADMIN';
OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID BLOCK_ID BLOCKS
ADMIN T4 TABLE 0 336 8
ADMIN T4 TABLE 1 344 8
ADMIN T4 TABLE 2 352 8
ADMIN T4 TABLE 3 360 8
ADMIN T4 TABLE 4 368 8
ADMIN T4 TABLE 5 376 8
ADMIN T4 TABLE 6 640 8
ADMIN T4 TABLE 7 648 8
ADMIN T4 TABLE 8 656 8
ADMIN T4 TABLE 9 664 8
ADMIN T4 TABLE 10 672 8
ADMIN T4 TABLE 11 680 8
ADMIN T4 TABLE 12 688 8
ADMIN T4 TABLE 13 696 8
ADMIN T4 TABLE 14 704 8
ADMIN T4 TABLE 15 712 8
ADMIN T4 TABLE 16 512 128
ADMIN T4 TABLE 17 768 128
- Db file sequential read
这个等待事件在实际生产库也很常见,当Oracle 需要每次I/O只读取单个数据块这样的操作时,会产生这个等待事件。
最常见的情况有索引的访问(除IFFS外的方式),回滚操作,以ROWID的方式访问表中的数据,重建控制文件,对文件头做DUMP等。
这里的sequential也并非指的是Oracle 按顺序的方式来访问数据,和db file scattered read一样,
它指的是读取的数据块在内存中是以连续的方式存放的。
这个等待事件有三个参数:
File#: 要读取的数据块锁在数据文件的文件号。
Block#: 要读取的起始数据块号。
Blocks: 要读取的数据块数目(这里应该等于1)。
- 測試 Db file sequential read 場景
SQL> alter system flush buffer_cache;
SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT TOTAL_WAITS AVERAGE_WAIT
db file sequential read 19030 1.32
db file scattered read 1216 2.06
db file single write 12 0.17
db file parallel read 8 8.54
create index ind_t4_01 on t4(row_no);
select * from t4 where row_no=1000;
SQL> select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event where upper(event) like 'DB FILE%';
EVENT TOTAL_WAITS AVERAGE_WAIT
db file sequential read 23455 1.12
db file scattered read 1731 1.73
db file single write 12 0.17
db file parallel read 17 6.67
- 数据文件关于Multi Block I/O和Single Block I/O的活动信息:
SQL> select f.file#,f.name,s.phyrds,s.phyblkrd,s.readtim,s.singleblkrds,s.singleblkrdtim,
(s.phyblkrd - s.singleblkrds) as multiblkrd,
(s.readtim - s.singleblkrdtim) as multiblkrdtim,
round(s.singleblkrdtim /decode(s.singleblkrds, 0, 1, s.singleblkrds),3) as singleblk_avgtim,
round((s.readtim - s.singleblkrdtim)/nullif((s.phyblkrd - s.singleblkrds), 0),3) as multiblk_avgtim
from v$filestat s, v$datafile f
where s.file# = f.file#;
FILE# NAME PHYRDS PHYBLKRD READTIM SINGLEBLKRDS SINGLEBLKRDTIM MULTIBLKRD MULTIBLKRDTIM SINGLEBLK_AVGTIM MULTIBLK_AVGTIM
9 /u02/oradata/MPAPEX/pdb1/system01.dbf 7605 19537 21867 6750 20024 12787 1843 2.967 0.144
10 /u02/oradata/MPAPEX/pdb1/sysaux01.dbf 12080 22635 5731 11345 4815 11290 916 0.424 0.081
11 /u02/oradata/MPAPEX/pdb1/undotbs01.dbf 55 55 214 55 214 0 0 3.891
17 /u02/oradata/MPAPEX/pdb1/PDB1_UD1.dbf 91 606 253 39 183 567 70 4.692 0.123
18 /u02/oradata/MPAPEX/pdb1/PDB1_UD2.dbf 151 638 535 125 420 513 115 3.36 0.224
19 /u02/oradata/MPAPEX/pdb1/I_PDB1_UD1.dbf 1 1 0 1 0 0 0 0
20 /u02/oradata/MPAPEX/pdb1/I_PDB1_UD2.dbf 1 1 0 1 0 0 0 0
21 /u02/oradata/MPAPEX/pdb1/apex182.dbf 4864 4968 720 4803 680 165 40 0.142 0.242
22 /u02/oradata/MPAPEX/pdb1/apex182_file.dbf 5 9 12 4 10 5 2 2.5 0.4
23 /u02/oradata/MPAPEX/pdb1/ords183.dbf 103 103 7 103 7 0 0 0.068
24 /u02/oradata/MPAPEX/pdb1/apextb.dbf 308 308 45 308 45 0 0 0.146
25 /u02/oradata/MPAPEX/pdb1/apextb2.dbf 1 1 0 1 0 0 0 0
SQL> select f.file#,f.name,s.phyrds,s.phyblkrd,s.readtim, --所有的读取工作信息
s.singleblkrds,s.singleblkrdtim, --Single Block I/O
(s.phyblkrd - s.singleblkrds) as multiblkrd, --Multi Block I/O次数
(s.readtim - s.singleblkrdtim) as multiblkrdtim, --Multi Block I/O时间
round(s.singleblkrdtim / decode(s.singleblkrds, 0, 1, s.singleblkrds),3) as singleblk_avgtim, --Single Block I/O 平均等待时间(cs)
round((s.readtim - s.singleblkrdtim)/nullif((s.phyblkrd - s.singleblkrds), 0),3) as multiblk_avgtim --Multi Block I/O 平均等待时间(cs)
from v$filestat s, v$datafile f
where s.file# = f.file#;
FILE# NAME PHYRDS PHYBLKRD READTIM SINGLEBLKRDS SINGLEBLKRDTIM MULTIBLKRD MULTIBLKRDTIM SINGLEBLK_AVGTIM MULTIBLK_AVGTIM
9 /u02/oradata/MPAPEX/pdb1/system01.dbf 7605 19537 21867 6750 20024 12787 1843 2.967 0.144
10 /u02/oradata/MPAPEX/pdb1/sysaux01.dbf 12080 22635 5731 11345 4815 11290 916 0.424 0.081
11 /u02/oradata/MPAPEX/pdb1/undotbs01.dbf 55 55 214 55 214 0 0 3.891
17 /u02/oradata/MPAPEX/pdb1/PDB1_UD1.dbf 91 606 253 39 183 567 70 4.692 0.123
18 /u02/oradata/MPAPEX/pdb1/PDB1_UD2.dbf 151 638 535 125 420 513 115 3.36 0.224
19 /u02/oradata/MPAPEX/pdb1/I_PDB1_UD1.dbf 1 1 0 1 0 0 0 0
20 /u02/oradata/MPAPEX/pdb1/I_PDB1_UD2.dbf 1 1 0 1 0 0 0 0
21 /u02/oradata/MPAPEX/pdb1/apex182.dbf 4864 4968 720 4803 680 165 40 0.142 0.242
22 /u02/oradata/MPAPEX/pdb1/apex182_file.dbf 5 9 12 4 10 5 2 2.5 0.4
23 /u02/oradata/MPAPEX/pdb1/ords183.dbf 103 103 7 103 7 0 0 0.068
24 /u02/oradata/MPAPEX/pdb1/apextb.dbf 308 308 45 308 45 0 0 0.146
25 /u02/oradata/MPAPEX/pdb1/apextb2.dbf 1 1 0 1 0 0 0 0
网友评论