首页 > 代码库 > 单块读

单块读

什么是单块读?
顾名思义,就是单个块单个块得读,等待事件表现为db file sequential read;


单块读有哪些情况?
大部分索引扫描是单块读(除index fast full scan),rowid回表是单块读,undo里读数据是单块读,行迁移行链接是单块读,读取段头是单块读,读边界块是单块读。


现在就来探讨下undo里读数据是单块读的情况:
--session1:
SQL> begin
  2  for x in 1..1000000 loop
  3  update t set id=999;
  4  end loop;
  5  commit;
  6  end;
  7  /


执行了太久了,不出结果
--session2:
SQL> select count(*) from t;


--session3:
SQL> @getsession_my


SID_SERIAL SQL_ID_NUM      P_NAME          P_VALUE         EVENT                     SQL_TEXT                MINUTE1 MINUTE_EXEC    INST_ID USERNAME
---------- --------------- --------------- --------------- ------------------------- -------------------- ---------- ----------- ---------- ----------
MACHINE
---------------
1,7        7kyc4rsrd3q1b,0 address         837617808       latch: cache buffers chai UPDATE T SET ID=999      469.68         7.1          1 SCOTT
                           number          150             ns
                           tries           0
lhj


29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from        .98         .58          1 SCOTT
                           block#          398158                                     t
                           blocks          1
lhj




2 rows selected.


Elapsed: 00:00:00.09


--这里select count(*) from t 对应的等待时间为 db file sequential read




--隔一会再查还是一样
SQL> @getsession_my


SID_SERIAL SQL_ID_NUM      P_NAME          P_VALUE         EVENT                     SQL_TEXT                MINUTE1 MINUTE_EXEC    INST_ID USERNAME
---------- --------------- --------------- --------------- ------------------------- -------------------- ---------- ----------- ---------- ----------
MACHINE
---------------
1,7        7kyc4rsrd3q1b,0 count           1               Data file init write      UPDATE T SET ID=999      470.17        7.58          1 SCOTT
                           intr            256
                           timeout         4294967295
lhj


29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from       1.47        1.07          1 SCOTT
                           block#          419088                                     t
                           blocks          1
lhj




2 rows selected.


Elapsed: 00:00:00.01


--file#对应的是undo表空间
SQL> select file_id,tablespace_name from dba_data_files where file_id = 3; 


   FILE_ID TABLESPACE_NAME
---------- ------------------------------
         3 UNDOTBS1                          --可见对应的是undo表空间


1 row selected.

Elapsed: 00:00:11.88


说明表在做dml的时候,此时再发出一个关于此表的查询,如果查询的数据刚好是dml的数据,那么是从undo表空间读取的。
undo有优点也有缺点:优点是能保证能保证数据的准确性,在修改数据之前,oracle会把要修改的copy到undo表空间,事务成功了则释放可重新利用undo,事务失败了则通过undo来回滚到dml之前。这是oracle独有的机制;缺点也很明显,就是undo里面读数据是单块读,速度非常慢。这也就是为什么很多数据库down掉之后,恢复要很长一段时间。





单块读