单块读

来源:互联网 发布:淘宝网中老年女衬衫 编辑:程序博客网 时间:2024/06/05 22:45
什么是单块读?顾名思义,就是单个块单个块得读,等待事件表现为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_mySID_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           0lhj29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from        .98         .58          1 SCOTT                           block#          398158                                     t                           blocks          1lhj2 rows selected.Elapsed: 00:00:00.09--这里select count(*) from t 对应的等待时间为 db file sequential read--隔一会再查还是一样SQL> @getsession_mySID_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         4294967295lhj29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from       1.47        1.07          1 SCOTT                           block#          419088                                     t                           blocks          1lhj2 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掉之后,恢复要很长一段时间。

0 0
原创粉丝点击