您好,登錄后才能下訂單哦!
Oracle Study之--Oracle等待事件(4)
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: 需要讀取的數據塊數目。
案例分析:
12:04:54 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event 12:04:59 2 where upper(event) like 'DB FILE%'; EVENT TOTAL_WAITS AVERAGE_WAIT ---------------------------------------------------------------- ----------- ------------ db file sequential read 5069 .02 db file scattered read 930 .03 db file single write 27 .36 db file parallel write 15 14.24 db file parallel read 34 .64 Elapsed: 00:00:00.12 12:06:53 SCOTT@ prod>select * from t1; 12:05:04 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event 2* where upper(event) like 'DB FILE%' EVENT TOTAL_WAITS AVERAGE_WAIT ---------------------------------------------------------------- ----------- ------------ db file sequential read 5166 .02 db file scattered read 966 .03 db file single write 27 .36 db file parallel write 16 13.69 db file parallel read 34 .64 Elapsed: 00:00:00.02
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。
14:16:34 SYS@ prod>show parameter mult NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_file_multiblock_read_count integer 19 parallel_adaptive_multi_user boolean TRUE 14:17:28 SYS@ prod>col segment_name for a20 14:18:08 SYS@ prod>select OWNER,SEGMENT_NAME ,SEGMENT_TYPE,EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents 14:18:47 2 where segment_name='T1' AND owner='SCOTT'; OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID BLOCK_ID BLOCKS ------------------------------ -------------------- ------------------ ---------- ---------- ---------- SCOTT T1 TABLE 0 168 8 SCOTT T1 TABLE 1 184 8 SCOTT T1 TABLE 2 192 8 SCOTT T1 TABLE 3 200 8 SCOTT T1 TABLE 4 208 8 SCOTT T1 TABLE 5 216 8 SCOTT T1 TABLE 6 224 8 SCOTT T1 TABLE 7 232 8 SCOTT T1 TABLE 8 240 8 SCOTT T1 TABLE 9 248 8 SCOTT T1 TABLE 10 256 8 SCOTT T1 TABLE 11 264 8 SCOTT T1 TABLE 12 272 8 SCOTT T1 TABLE 13 280 8 SCOTT T1 TABLE 14 288 8 SCOTT T1 TABLE 15 296 8 SCOTT T1 TABLE 16 384 128 OWNER SEGMENT_NAME SEGMENT_TYPE EXTENT_ID BLOCK_ID BLOCKS ------------------------------ -------------------- ------------------ ---------- ---------- ---------- SCOTT T1 TABLE 17 512 128 SCOTT T1 TABLE 18 640 128 SCOTT T1 TABLE 19 768 128 SCOTT T1 TABLE 20 896 128 SCOTT T1 TABLE 21 1024 128 22 rows selected. Elapsed: 00:00:00.78
Db file sequential read
這個等待事件在實際生產庫也很常見,當Oracle 需要每次I/O只讀取單個數據塊這樣的操作時,會產生這個等待事件。最常見的情況有索引的訪問(除IFFS外的方式),回滾操作,以ROWID的方式訪問表中的數據,重建控制文件,對文件頭做DUMP等。
這里的sequential也并非指的是Oracle 按順序的方式來訪問數據,和db file scattered read一樣,它指的是讀取的數據塊在內存中是以連續的方式存放的。
這個等待事件有三個參數:
File#: 要讀取的數據塊鎖在數據文件的文件號。
Block#: 要讀取的起始數據塊號。
Blocks: 要讀取的數據塊數目(這里應該等于1)。
案例分析:
14:28:55 SYS@ prod>alter system flush buffer_cache; System altered. Elapsed: 00:00:00.28 14:29:08 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event 14:29:41 2 where upper(event) like 'DB FILE%'; EVENT TOTAL_WAITS AVERAGE_WAIT ---------------------------------------------------------------- ----------- ------------ db file sequential read 13991 .04 db file scattered read 1637 .03 db file single write 36 .35 db file parallel write 946 2.98 db file parallel read 46 .48 Elapsed: 00:00:00.03 14:26:46 SCOTT@ prod>create index t1_ind on t1(id); Index created. 14:28:30 SCOTT@ prod>select * from t1 where id=1000 14:28:48 2 ; ID ---------- 1000 1000 1000 Elapsed: 00:00:00.05 14:29:46 SYS@ prod>select event,TOTAL_WAITS,AVERAGE_WAIT from v$system_event 2* where upper(event) like 'DB FILE%' EVENT TOTAL_WAITS AVERAGE_WAIT ---------------------------------------------------------------- ----------- ------------ db file sequential read 13994 .04 db file scattered read 1637 .03 db file single write 36 .35 db file parallel write 946 2.98 db file parallel read 46 .48 Elapsed: 00:00:00.03
14:29:58 SYS@ prod>
數據文件關于Multi Block I/O和Single Block I/O的活動信息:
14:38:22 SYS@ prod>select f.file#, 2 f.name, 3 s.phyrds, 4 s.phyblkrd, 5 s.readtim, 6 s.singleblkrds, 7 s.singleblkrdtim, 8 (s.phyblkrd - s.singleblkrds) as multiblkrd, 9 (s.readtim - s.singleblkrdtim) as multiblkrdtim, 10 round(s.singleblkrdtim / 11 decode(s.singleblkrds, 0, 1, s.singleblkrds), 12 3) as singleblk_avgtim, 13 round((s.readtim - s.singleblkrdtim) / 14 nullif((s.phyblkrd - s.singleblkrds), 0), 15 3) as multiblk_avgtim 16 from v$filestat s, v$datafile f 17* where s.file# = f.file# FILE# NAME PHYRDS PHYBLKRD READTIM SINGLEBLKRDS SINGLEBLKRDTIM MULTIBLKRD MULTIBLKRDTIM SINGLEBLK_AVGTIM MULTIBLK_AVGTIM ---------- -------------------------------------------------- ---------- ---------- ---------- ------------ -------------- ---------- ------------- ---------------- --------------- 1 /u01/app/oracle/oradata/prod/system01.dbf 16977 68027 419 12896 373 55131 46 .029 .001 2 /u01/app/oracle/oradata/prod/sysaux01.dbf 2041 3089 142 1894 134 1195 8 .071 .007 3 /u01/app/oracle/oradata/prod/undotbs1.dbf 11 11 4 11 4 0 0 .364 4 /u01/app/oracle/oradata/prod/users01.dbf 591 3355 8 359 7 2996 1 .019 0 5 /u01/app/oracle/oradata/prod/example01.dbf 10 14 0 9 0 5 0 0 0 6 /u01/app/oracle/oradata/prod/tbs1.dbf 4 4 0 4 0 0 0 0 7 /u01/app/oracle/oradata/prod/undotbs2.dbf 1815 1818 50 1812 48 6 2 .026 .333 8 /u01/app/oracle/oradata/prod/perftbs01.dbf 4 4 0 4 0 0 0 0 9 /u01/app/oracle/oradata/prod/tbs2.dbf 4 4 0 4 0 0 0 0 9 rows selected. 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#;
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。